簡體   English   中英

由兩名成員中的任何一名成員散布

[英]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;
};

我想確定一個優先於deviceFoo實例(當它設置時)。
意思是,當device被設置時,我想根據device進行哈希( 單獨! - 這樣兩個具有相同device和不同nameFoo將被認為是相同的對象哈希)。
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集,具有相同哈希碼的概率是未知的(無論多么高不太可能)。

  • 考慮一個轉換為字符串並調用字符串散列的int散列函數 - 這將導致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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM