[英]Hashing by either one of two members
雖然這個問題與c ++有關,但它是一個普遍的哈希問題,也可以回答其他語言。
我有一個由它擁有的2個成員中的任何一個識別的類(讓我們稱之為設備和名稱)。
class Foo {
static const int NO_DEVICE = 0;
bool isDeviceSet() {
return device != NO_DEVICE;
}
private:
int device;
std::string name;
};
我想確定一個優先於device
的Foo
實例(當它設置時)。
意思是,當device
被設置時,我想根據device
進行哈希( 單獨! - 這樣兩個具有相同device
和不同name
的Foo
將被認為是相同的對象哈希)。
當device
未設置時,我想根據name
進行哈希。
我的問題:
是否其中一個成員足夠安全?
例如,任何一個散列都是這樣的:
namespace std {
size_t hash<Foo>::operator()(Foo const& f) const {
if (f.isDeviceSet()) {
return std::hash<int>()(f.deviceId);
}
return std::hash<std::string>()(f.name);
}
}
這個問題是,有人可能會爭辯說(根據每個哈希函數的實現),2個不同的Foo
,一個具有device
集,一個沒有device
集,具有相同哈希碼的概率是未知的(無論多么高不太可能)。
Foo{2, "bar"}
和Foo{0, "2"}
具有相同的散列碼。 另一方面,我不確定在散列中組合isDeviceSet()
是否真的會給出更好的結果(對於一般情況 - 顯然它解決了上面子彈中的示例):
namespace std {
size_t hash<Foo>::operator()(Foo const& f) const {
if (f.isDeviceSet()) {
std::pair<bool, int> p(f.isDeviceSet(), f.device);
boost::hash< std::pair<bool, int> > hasher;
return hasher(p);
}
std::pair<bool, std::string> p(f.isDeviceIdSet(), f.name);
boost::hash< std::pair<bool, std::string> > hasher;
return hasher(p);
}
}
任何見解/其他哈希想法都是受歡迎的。
哈希總是與平等相結合。
您需要定義一個與您認為相等的元素匹配的相等操作,並且與您認為不相等的元素不匹配。
然后定義一個哈希函數,該函數必須具有相等認為等於相同哈希碼的所有元素。 對於被認為不相等的元素,根本沒有要求。
任何涉及散列的算法都必須在相同的哈希碼中存活,以獲得不平等的對象, 如果存在比可能的哈希碼更多的可能對象,則永遠不可能保證不同對象的不同哈希碼。 即使您的哈希函數返回0,任何使用它的算法都應該正常工作,除非可能效率較低。
當您考慮制作哈希函數的復雜程度時:它應該只是使具有相同哈希碼的現有對象集合較小。 它不一定非常完美,除非你有一個非常重要的哈希表。 但是哈希函數本身在某種程度上也是性能關鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.