Hash時取模為什麼要模質數

2021-08-19 04:19:09 字數 451 閱讀 8153

首先來說假如關鍵字是隨機分布的,那麼無所謂一定要模質數。但在實際中往往關鍵字有某種規律,例如大量的等差數列,那麼公差和模數不互質的時候發生碰撞的概率會變大,而用質數就可以很大程度上迴避這個問題。

考慮模是合數的情況:假設n = kn, m = km, n和m存在最大公因數k,此時可以將n % m = r轉化為公式n = mq + r,即kn = kmq + r。其中q是商,r是餘數。「表面上」r的取值範圍是(忽視了只有n與m最大公因數為1時,才能取整個餘數集合r的定理),一片和諧。但是可以對公式進行稍微的變換,n = mq + (r/k),由於n和mq都是整數,則(r/k)也是整數。此時我們看一看到(r/k)的取值範圍是 = 。恢復到原式,也是就r的「實際」取值範圍是,縮小了k倍。

可以明顯看出,在模和關鍵字有公因數的情況下,模後取值範圍減少,衝突概率增加,尤其是關鍵字是等差數列。而模為質數就不會出現這種情況。

為什麼要模1000000007

先看一下常用資料型別的數值範圍 32位系統 位元組 型別 範圍 長度 位元組型別 範圍長度 一位元組 2 8 char 128 127 3一位元組 2 8 unsigned char 0 255 3二位元組 2 16 short 32768 32767 5二位元組 2 16 unsigned sho...

為什麼求模運算要用素數(質數)

好的hash函式需要把原始資料均勻地分布到hash陣列裡 原始資料不大會是真正的隨機的,可能有某些規律,比如大部分是偶數,這時候如果hash陣列容量是偶數,容易使原始資料hash後不會均勻分布。比如 2 4 6 8 10 12這6個數,如果對 6 取餘 得到 2 4 0 2 4 0 只會得到3種ha...

為什麼求模運算要用素數(質數) 雜湊表設計

為什麼求模運算要用素數 質數 雜湊表設計 by admin 2013 年 7 月 25 日 雜記,程式設計技術 在設計用除法來散射的雜湊表時,我們都會用數值模雜湊表大小,得到的餘數來作為id存入雜湊表對應格仔中。所有文章都表明要用乙個較大的素數來作為雜湊表的大小,也就是要模乙個較大的素數。但為什麼就...