-2長度是否要是素數,能不能是合數,這個問題大家的意見得不到統一。支援用素數的人的理由是,素數可以使得雜湊的分布更加均勻。
hash(k) = mix(k) mod m
雜湊計算中,求餘往往是最後一步,因為沒有機器擁有無限的記憶體,所以必須把結果放入到有限的桶(bucket)中。求餘前的運算,假如混淆(mix)得比較好的話,那麼m使用素數還是合數,分布是一樣的。假如混淆(mix)得不夠好的話,那麼乙個素數可以把一些common pattern加以區別。至於什麼樣的資料混淆用什麼樣的mix演算法比較好,這個得經統計才可以得出結論。總的來講,使用乙個素數總沒有錯,雖然執行慢了點,卻可以得到相對較好的統計特性。個人看法。
knuth的the art of computer programming中,也用的是一樣的理由推薦用素數的m。手上沒有書,他應該沒有提到合數的問題。上面也僅僅是我個人的一些想法,沒有經過嚴格的證明,我也沒有能力去證明。當然,很歡迎有人來指正我的錯誤。
手上有《演算法導論》,第十一章雜湊表,對這個問題也沒有給出嚴格的證明。但是它提到這樣的乙個問題,若m=2^p-1,則所有以2^p為基數的解釋的字串,無論字元位置怎麼變化,得出的雜湊值都是一樣的。這個證明比較簡單,用同餘的性質就可以證明,最後的值,其實是各個字元值的和再對m取餘,所以雜湊值不會隨字元的位置發生變化。
update:
stackoverflow上也有對這個問題的討論。
上面的文章的觀點和我總結出來的基本一致。
from
雜湊和素數打表
舉例子吧 乙個陣列a 7 然後再定義乙個a陣列中最大元素 1的陣列b 14 for i 0 i 7 i b a i 1 如果輸了乙個數w,則需要判斷b w 是不是為1,如果是1,a陣列裡有這個數 舉例子吧 乙個陣列a 7 然後再定義乙個a陣列中最大元素 1的陣列b 14 for i 0 i 14 i...
雜湊表查詢 的 平均長度
將關鍵字序列 7 8 30 11 18 9 14 雜湊儲存到雜湊表中。雜湊表的儲存空間是乙個下標從0開始的一維陣列。雜湊函式為 h key key 3 mod 7,處理衝突採用線性探測再雜湊法,要求裝填 載 因子為0.7。1 請畫出所構造的雜湊表 2 分別計算等概率情況下查詢成功和查詢不成功的平均查...
雜湊和雜湊表 門票
時間限制 1 sec 記憶體限制 128 mb 提交 26 解決 2 提交 狀態 討論版 命題人 admin 題目描述 rpk要帶msh去乙個更加神秘的地方!rpk帶著msh穿過廣場,在第1618塊磚上按下了乙個按鈕,在一面牆上隨即出現了乙個把手。rpk握住把手,開啟了一扇石質大門。他們穿過悠長而芬...