1. 程式人生 > >轉:經典的String Hash演算法

轉:經典的String Hash演算法

設計高效演算法往往需要使用Hash表,O(1)級的查詢速度是任何別的演算法無法比擬的。
所謂Hash,一般是一個整數,通過某種演算法,可以把一個字串"pack"成一個整數,這個數稱為Hash,當然,一個整數是無法對應一個字串的。
所以Hash函式是Hash表最核心的部分,對於一個Hash函式,評價其優劣的標準應為隨機性或離散性,即對任意一組標本,進入Hash表每一個單元(cell)之概率的平均程度,因為這個概率越平均,兩個字串計算出的Hash值相等hash collision的可能越小,資料在表中的分佈就越平均,表的空間利用率就越高。

Hash表的構造和衝突的不同實現方法對執行效率也有一定的影響.

DJBHash是一種非常流行的演算法,俗稱"Times33"演算法。Times33的演算法很簡單,就是不斷的乘33,原型如下


hash(i) = hash(i-1) * 33 + str[i]

Time33在效率和隨機性兩方面上俱佳。

其它常用字串雜湊函式有:
BKDRHash,APHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等。BKDRHash和APHash也是比較優秀的演算法。當然要根據具體應用選擇合適的Hash演算法,比如字符集的考慮。

APHash作者Arash Partow有一個頁面很有參考價值,包括了各種Hash的介紹及程式碼。

http://www.partow.net/programming/hashfunctions/#RSHashFunction

Blizzard使用的演算法比較精妙,被稱為"One-Way Hash",並且在Hash表中使用了三個雜湊值(一個用來確定位置,另外兩個用來校驗)。


MD5等加密演算法也屬於hash,不過已被中國學者找到碰撞檢測的破解演算法 posted on 2012-12-26 17:08 胡滿超 閱讀(2340) 評論(0)  編輯 收藏 引用 所屬分類: 演算法轉載