2013-08-17 51 views
0

我是新來的散列一般和STL世界,看到新的std::unrdered_set和SGI:hash_set,它們都使用hasher hash。我明白要獲得一個很好的加載因子,你可能需要編寫自己的散列函數,並且我可以編寫一個散列函數。C++散列函數,原始haser如何實現散列<int xkey>實現

但是,我試圖深入瞭解原始默認has_functions的寫法。 我的問題是: 1)最初的默認HashFcn是如何寫的;更具體地說,哈希如何生成? 它是基於一些僞隨機數。任何人都可以指向我的頭文件(我有點迷失在文檔中),我可以在那裏查找;哈希散列是如何實現的。

2)它如何保證每一次,你將能夠獲得相同的密鑰?

請讓我知道,如果我能以任何方式使我的問題更清晰?

回答

0

在GCC的版本,我碰巧在這裏安裝,所需的散列函數是/usr/lib/gcc/i686-pc-cygwin/4.7.3/include/c++/bits/functional_hash.h

的整數類型的hashers使用宏_Cxx_hashtable_define_trivial_hash定義。正如你可能從名字中期望的那樣,這只是將輸入值轉換爲size_t

這是gcc如何做到的。如果你使用的是gcc,那麼你應該有一個類似命名的文件。如果你使用的是不同的編譯器,那麼源代碼將在其他地方。並不要求每個實現對整數類型使用簡單的散列,但我懷疑它是非常普遍的。

它不是基於隨機數發生器,並且希望現在很明顯這個功能可以保證每次都能爲相同的輸入返回相同的密鑰!使用一個簡單的散列的原因是它的速度一樣快。如果它給你的數據分佈不好(因爲你的值往往會模擬桶的數量),那麼你可以使用一個不同的,較慢的哈希函數或不同數量的桶(std::unordered_set不允許指定確切的數字的桶,但它確實可以讓你設置一個最低限度)。由於庫實現者不知道關於你的數據的任何信息,我認爲他們往往不會引入較慢的哈希函數作爲默認值。

0

散列函數必須是確定性的,即相同的輸入必須始終產生相同的結果。

一般來說,你散列函數與生產大約相等的概率爲任意的輸入輸出全部(但同時可取的,這是沒有強制性的 - 對於任何給定的哈希函數,總是會有一個任意數量的輸入產生相同的輸出)。

一般而言,您希望散列函數快速並且依賴於(至少在某種程度上)整個輸入。

一個相當常見的模式是:從一些半隨機輸入開始。將一個字節的輸入與當前值組合。做一些可以移動位的東西(乘法,旋轉等)對輸入的所有字節重複。