[原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...
設有一個哈希函數
H( c ) = c % N;
當N取一個合數時,最簡單的例子是取2^n,比如說取2^3=8,這時候
H( 11100(二進制) ) = H( 28 ) = 4
H( 10100(二進制) ) = H( 20 )= 4
因為除以一個2^n,可以看為向左移動n位,而模除得到的余數其實就是這移掉的n位數,因此在這種情況下,除開這低位的n位數以外,剩余的高位數所有位都沒有利用上,也就是說無論高位上的位取什么數,都對最后的余數不影響,從而有很多不同的數,但由于低n位是一樣的,所以依然發生沖突。也就是導致沖突的幾率增大。
關于為什么模除以素數就比除以合數沖突概率小?以下是個人推測:
當除以一個素數的時候(素數定義:只有1和它本身兩個因數的自然數),由于該數不是2的倍數,因此除法不能完整的說是左右多少位,如果硬要除以該素數按進行移位來算的話,可以說移掉的低多少位,不再是一個整數,那么模除將影響的不再是低多少位數,而是相比于合數來說,要影響更多位,甚至說基本上會影響一個數所有的而二進制位。從而讓一個數的所有二進制位都對最后產生的模除結果發揮了作用,相比于模除一個合數僅僅是低n位發揮作用來說,模除以一個素數發生沖突的概率就會更小。
轉載于:https://www.cnblogs.com/lordcheng/p/7344652.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的[原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口隔离模式
- 下一篇: 在Python中用Selenium执行J