1. 程式人生 > >雜湊函式中求模運算為什麼要使用素數,原因分析

雜湊函式中求模運算為什麼要使用素數,原因分析

一、雜湊函式

雜湊函式即是將元素對映到對應槽位置的方法。

一個好的雜湊函式應該是儘可能的將元素均勻的雜湊到 m 個槽位中的一個。

二、除法雜湊法

雜湊函式的實現有很多種,其中一種常見的雜湊函式即 除法雜湊法,h(k) = k mod m,通過取 k 除以 m 的餘數,將關鍵字 k 對映到 m 個槽上。由於只需做一次除法操作,所以除法雜湊法是非常快的。

當我們使用除法雜湊法時,裝載因子 m 的選擇很重要。《演算法導論》一書中,建議我們使用一個不太接近 2 的整數冪的素數,作為 m 的選擇。

那麼在求模運算中為什麼建議要使用素數呢?這是因為使用素數可以讓元素取模後的值,更不容易發生衝撞。至於是為什麼,我們在下面探討。

三、對素數取模的好處

前面說道,對素數取模,結果更不容易發生衝撞,即結果可以更均勻的雜湊到不同的槽位中。那麼原理是怎麼樣的呢?

合數和素數:合數即有兩個以上的因數,素數(質數)即只有兩個因數,分別為 1 和其本身。

如果對一個合數取模,那麼對其某個因數取模,結果可能仍然一致。例如 10 對 8 取模,結果為 2,對 4 取模,結果也為 2。而我們對一個素數取模,由於素數只有 1 和其本身兩個素數,即不可能出現上述情形。

四、例項分析

1. 數列A:1,3,5,7,9,11,13,15

假設選取 8 取模,結果為:

餘數 0 1 2 3 4 5 6 7
數值 1 3 5 7
數值 9 11 13 15

每個數間隔 2,2 是 8 的一個因數,容易發生衝突,不均勻分佈。

假設選取 7 取模,結果為:

餘數 0 1 2 3 4 5 6
數值 7 1 9 3 11 5 13
數值 15

每個數間隔 2,2 不是 7 的因數,均勻分佈。

2. 數列B:2,5,8,11,14,17,20,23

假設選取 8 取模,結果為:

餘數 0 1 2 3 4 5 6 7
數值 8 17 2 11 20 5 14 7
數值 23

每個數間隔 3,3 不是 8 的因數,均勻分佈。

假設選取 7 取模,結果為:

餘數 0 1 2 3 4 5 6
數值 14 8 2 17 11 5 20
數值 23

每個數間隔 3,3 不是 7 的因數,均勻分佈。

3. 總結

如果數列的間隔為 1,那麼不管模數為幾都會均勻分佈。

如果間隔是模數的因數,則容易發生衝突,且模數的因數越多,衝突的可能性越大。

素數只有兩個因數,所以可以保證發生衝突的可能性最小。

相關推薦

函式運算為什麼使用素數原因分析

一、雜湊函式 雜湊函式即是將元素對映到對應槽位置的方法。 一個好的雜湊函式應該是儘可能的將元素均勻的雜湊到 m 個槽位中的一個。 二、除法雜湊法 雜湊函式的實現有很多種,其中一種常見的雜湊函式即 除法雜湊法,h(k) = k mod m,通過取 k 除以 m 的餘數,將關鍵字 k 對映到 m 個

Oracle 10g利用函式提高查詢速度

原文地址:  當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。 如果員工記錄非常多的話,那麼資料表的響應速度就會逐漸變慢。你可以通過選擇值相對等分

C++對hash_map自定義函式和比較函式的理解

#include "stdafx.h" #include <iostream> #include <hash_map> #include <vector>using std::vector; using stdext::hash_map;class  hash_wchar_

Hash(/)表衝突處理及命中計算

前言   本片部落格主要講的是雜湊表中簡單的衝突處理的方法,以及命中率計算。原理方面基本沒有講解,基本就講個方法,主要用於知識記錄以及幫助一些刷題玩家瀏覽。   簡而言之,不講技術,只講方法。 引言   寫這篇部落格的契機是在刷pat甲級題遇到了一道寫雜湊的題目,結果英文太次被欺負了。之後靠翻譯讀懂題

函式、Map-Reduce與Hadoop

雜湊函式 雜湊函式又叫雜湊函式,雜湊函式的輸入域可以是非常大的範圍,比如任意字串,但是輸出域是固定範圍,假設為s。 雜湊函式的性質: 典型的雜湊函式都擁有無限的輸入值域。 輸入值相同時,返回值相同,通常將返回值稱為雜湊值。 輸入值不同時,返回值可能相同,也可能

平方探測法處理函式衝突

  平方探測法是一種較好的處理衝突的方法,可以避免出現“堆積”問題,它的缺點是不能探測到散列表上的所有單元,但至少能探測到一半單元。下面通過一個例子來理解:   設Hash函式為 H( key ) = key mod 7,雜湊表的地址空間為0,1,...,10,開始時雜湊表為空,用平方探測法解決衝突,畫出依

演算法導論 第十一章:散列表 筆記(直接定址表、散列表、通過連結法解決碰撞、函式、開放定址法、完全

前面討論的各種資料結構中,記錄在各種結構中的相對位置是隨機的,和在記錄的關鍵字之間不存在有確定的關係,因此在查詢記錄是需要進行一系列和關鍵字的比較。而理想的情況是不希望進行任何的比較,一次存取便能得到所查記錄。那就必須在記錄的儲存位置和它的關鍵字之間建立一種確定的關係f,使每個關鍵字和結構中有一

函式函式Hash Function)

說明          雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為O(1)。 簡單的說,hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出

djb2:一個產生簡單的隨機分佈的函式

目錄 LCG演算法 示例程式碼 djb2 示例程式碼 為什麼選擇引數33和 33 was chosen because: 5381 was chosen because 雜湊選擇參考 LCG

《資料結構與演算法之美》專欄閱讀筆記5——散列表和函式

這應該是看完最呆(沒有想到的那種呆~)的一個小章節了,給作者鼓掌,講的好好。果然抽象能力才是王道 文章目錄 1、散列表 1.1、小概念 1.2、雜湊函式 1

函式和陣列簽名概念

一、雜湊函式   也稱為雜湊函式,訊息摘要函式,單向函式或雜湊函式。 1. 作用:   不是完成資料加密和解密的工作,而是用來驗證資料的完整性的技術。  如下圖,通過對訊息進行雜湊,然後把訊息和雜湊值hashA一起傳送出去,當接受者收到訊息和雜湊值後,先對訊息進行雜湊,如果雜湊值

MD5加密(單向的函式)

作用:將資料庫的明文密碼加密為其他格式,更加保證安全性 已知: 一張表 user 存 id,username,password。 表中已有一條資料:1,tom,123 1)首先我們先來看一個mysql加密語句: 現在將 密碼 ‘123’ 加密 : update

Go語言實現單向函式 —— MD5訊息摘要演算法、SHA256與224(Go語言實現)

 MD5訊息摘要演算法 MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。 Go語言實現方式一: packag

php的函式

php的雜湊函式 雜湊函式: echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 驗證函式: boolean password_verify ( string&nbs

C語言運算-hdu6124(打表找規律)

題目連結:https://vjudge.net/problem/HDU-6124 題目描述: 題目大意就是給你一個數,判斷這個數 % 其它數後共有幾種結果。 這題對我來說最大的難點是我不太知道每個數 餘 其他的數應該得出什麼結果,後來參考了別人的部落格,才弄清楚了。現在我就舉一些例子來說明一下:

布隆過濾器 一致 函式

雜湊函式 :又名雜湊函式。       布隆過濾器:1經典結構 要求的失誤率 2  原理:每個url經過K個雜湊函式在對應相應位置描黑,所有url描黑後,整個布隆過濾器相應型別的陣列相當位置描黑,之後計算K個雜湊函式對應位置,如果K個雜湊函

函式的構造方法

一個“好”的雜湊函式一般應考慮下列兩個因素: 計算簡單,以便提高轉換速度; 關鍵詞對應的地址空間分佈均勻,以儘量減少衝突。 1 數字關鍵詞的雜湊函式構造 1.1 直接定址法 取關鍵詞的某個線性函式值為雜湊地址,即 h(key) = a × key + b

運算(%)和按位與運算(&)

最近看了看HashMap原始碼,覺得裡面的一個按位與運算用的很優雅,記錄一下。 jdk7中,HashMap是“陣列+連結串列”的結構,為了讓HashMap裡的元素分佈的更加均勻,就要在陣列中給每個元素一個合適的位置,求模運算是一個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法

單向函式的性質

一 根據任意長度計算出固定長度的雜湊值 首先,單向雜湊函式的輸入必須能夠是任意長度的訊息。其次,無論輸入多長的訊息,單向雜湊函式必須都能夠生成長度很短的雜湊值,如果訊息越長生成的雜湊值越長的話就不好用了。從使用方便的角度,雜湊值的長度最好是短且固定的。 二 能夠快速計算出

單向函式的實際應用

一 單向雜湊函式相關術語 單向雜湊函式也稱為訊息摘要函式、雜湊函式或者雜湊函式。 輸入單向雜湊函式的訊息也稱為原像。 單向雜湊函式輸出的雜湊值也稱為訊息摘要或者指紋。 完整性也稱為一致性。 二 單向雜湊函式實際應用 1 檢測軟體是否被篡改 可以使用單向雜湊函式來