問題
我們有一組符號序列,應該映射到預定義數量的桶索引。
先決條件
符號序列的長度受到限制(64 個字符/位元組),使用的散列演算法是針對 32 位散列值的Bob Jenkins 散列的 Delphi 實作。
為了進一步將這些哈希值分布在一定數量的桶上,我們使用以下公式:
bucket_number := (hashvalue mod (num_buckets - 2)) 2);
(我們不希望 {0,1} 出現在結果集中)
問題
一位同事有一些疑問,我們需要選擇一個素數num_buckets來實作將符號序列映射到bucket_numbers 的最佳分布。
團隊中的大多數人認為這更“巫毒”但很嚴重,盡管我們的隊友只是聲稱這是數學固有的。
我可以想象,我們使用的某些符號序列模式(這只是實際允許的非常有限的子集)可能更喜歡某些hashvalues,但通常我認為這對于大量符號序列來說并不重要。
哈希演算法應該已經以最佳方式分配hashvalues,我懷疑質數除數是否真的會產生顯著差異(也無法憑經驗衡量),特別是因為 Bob Jenkins 哈希演算也不涉及任何質數,據我所知。
[TL;DR]
質數模除數是否重要?
uj5u.com熱心網友回復:
你的同事完全錯了。
如果散列運行良好,則所有散列值的可能性應該相同,其關系從輸入資料中并不明顯。
當您獲取哈希 mod 一些值時,您將同樣可能的哈希輸入映射到數量減少的輸出存盤桶。結果現在不是均勻分布到輸出可以由不同數量的輸入產生的程度。只要桶的數量相對于哈希值的范圍很小,這種差異就很小。它的順序是# of buckets / # of hash values。由于桶的數量通常在 10^6 以下,而哈希值的數量超過 10^19,這確實非常小。但是如果桶的數量除以哈希值的范圍,則沒有差異。
除了當桶的數量劃分散列函式的范圍時獲得最佳分布的點之外,基本性不會進入它。由于散列函式的范圍通常是 2 的冪,所以質數的桶不太可能為您做任何事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477026.html
