整數雜湊函式

2021-06-13 05:47:04 字數 2034 閱讀 7992

很多時候,可以直接用整數作為鍵,比如qq號碼,手機號碼,但這些號碼的分布性不是均勻的(比如高位的變化更少,低位變化更多)。

分布均勻指的是每位為0或1的概率都是一樣的。

1. 函式要是可逆的(1對1的對映)

2. 雪崩效應(輸入中1bit的變化 影響 輸出中1/4 到 1/2的bits變化)

key + const_value 加法是可逆

key - const_value 減法是可逆

key ^ const_value 異或是可逆的

~key 取反也是可逆的

key * const_value 乘以乙個奇數也是可逆的

a = (a+0xfd7046c5) + (a<<3);  // 《和+ 是可逆

a = (a+0xfd7046c5) + (a>>3);  // >>和+ 不保證是可逆的

a = (a^0xb55a4f09) ^ (a<<16); // ^ 和<< 是可逆

a = (a^0xb55a4f09) ^ (a>>16); // ^ 和》 是可逆

+ bit is 1 導致左邊臨近的所有1和最後乙個0被反轉( 0111 + 1 = 1000)

- bit is 1 導致左邊臨近的所有0和最後乙個1被反轉( 1000 - 1 = 0111)

所以加法和減法可以從低向高擴散變化

~ 可以把過多的0變1,把過多的1變成零,最後結合原始值,就可以保持0和1的平衡,以便 +或-可以有效擴散變化。

<< 讓低位轉到高位。

>> 讓高位轉到低位。

^ 會把某些位反轉, 異或可以把兩個變數的變化組合一起來,這經常跟移位一起來實現1個bit的變化擴散到2個bit上。

乘法的本質是 多個<< 和 +,也可以引起雪崩。 除法也可以影響雪崩(特別是素數)。

不用乘法和除法的原因的是,整數的乘法和除法太耗cpu了,整數除法是最慢的操作,比浮點數數除法還慢,在一些risc機器上可能是上百倍的差距。

《計算機程式設計藝術》中講過: 乘以乙個**分割數:2654435761(2^32) 可以得到 hash.

hash = key*2654435761;

乘法的問題在於,低位可以影響高位,但高位不能影響低位。 分布是不均勻的。

但不是說乘法hash就沒有用,在大量指令碼語言中,物件的hash是通過物件的位址值來算hash的(因為物件本身會變化),

物件分配的特點決定了,位址的高位是不變化或變化極少。

uint32 address_hash(char* addr)

這時候mask, 應該選擇高位更好(0xffff0000)

hash = key%prime

除法的問題在於, 除數需要是素數,而且整數除法比較耗時。

如果除數不是素數,就要求hash值是均勻分布。

其實除法hash多是用在雜湊表中求桶的位置,如果不能保證鍵的雜湊函式是均勻的,那麼建議使用素數來取模。

如果可以保證鍵值的雜湊函式的質量,那麼使用 mask( &mask)操作取代取模,效率會更高。

uint32_t hash32shift(uint32_t key)

uint32_t hash( uint32_t a)

這六個數是隨機數, 通過設定合理的6個數,你可以找到對應的perfect hash.

uint64_t hash64shift(uint64_t key)

uint32_t hash64_32shift(uint64_t key)

uint32_t mix(uint32_t a, uint32_t b, uint32_t c)

雜湊的定義與整數雜湊

一般來說,雜湊可以濃縮成一句話 將元素通過乙個函式轉化為整數,使得該整數可以盡量唯一地代表這個元素。其中,把這個轉換函式稱為雜湊函式h,也就是說,如果該元素在轉換前為key,那麼轉換後就是乙個整數h key 常見的雜湊函式有直接位址法 平方取中法 除留餘數法等。其中,直接位址法是指恒等變換h key...

字串雜湊到整數函式,演算法

基本概念 所謂完美雜湊函式,就是指沒有衝突的雜湊函式,即對任意的 key1 key2 有h key1 h key2 設定義域為x,值域為y,n x m y 那麼肯定有m n,如果對於不同的key1,key2屬於x,有h key1 h key2 那麼稱h為完美雜湊函式,當m n時,h稱為最小完美雜湊函...

雜湊函式(雜湊函式,Hash Function)

說明 雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為o 1 簡單的說,hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出字串的長度稱為hash函式的位數。下圖 於維基百科 雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料...