1. 程式人生 > >一個字串的雜湊函式

一個字串的雜湊函式

雜湊函式一直對我來說都是比較神祕的東東,其實並不複雜,但是一個想要一個好的雜湊函式不簡單。

這個雜湊函式,這是來自於雲風的部落格,來自於 Lua 的實現,說起他,一個人向中國推薦了 Lua 指令碼,值得佩服。

unsigned long hash(const char* name, size_t len){
    unsigned long h = (unsigned long) len;
    size_t step = (len >> 5) + 1;
    for(size_t i = len; i >= step; i -= step)
        h = h ^ (h<<5
) + (h>>2) + (unsigned long)name[i-1] return h; }

雲風: 一個方便的 hash 函式 應該雜湊的比較開(不要集中),雜湊函式計算速度和字串長度關係不大,又不能只計算字串的開頭和結尾。這個函式時從 Lua中看到的。

這個雜湊值是 unsigned long 型別,如果你想要你的雜湊值在一個範圍之內,比如說10000。那麼還應該 對值進行取模 hash(str) mod 10000

如何評價一個雜湊函式的好壞(我自己的標準):
1. 雜湊函式應該讓值很分散,減少衝突 (如何證實呢?)
2. 雜湊函式的計算速度,(和字串的長度無關,並且又不能只利用字串固定的一部分)
3. 整數值的雜湊 和 字串的雜湊函式有區別嗎? 標準庫中的雜湊函式時如何實現的?