djb2 乙個產生簡單的隨機分布的雜湊函式

2022-03-09 02:52:24 字數 1991 閱讀 8976

目錄djb2

雜湊選擇參考

djb2與lcg很類似,故先介紹 lcg。

lcg(linear congruential generator)演算法是乙個古老的產生隨機數的演算法。由以下引數產生引數m

acx性質

模數乘數

加數隨機數

作用取模

移位偏移

作為結果

lcg演算法是如下的乙個遞推公式,每下乙個隨機數是當前隨機數向左移動 log2 a 位,加上乙個 c,最後對 m 取餘,使隨機數限制在 0 ~ m-1 內

從該式可以看出,該演算法由於構成簡單,具有以下優點:

以下是針對不同引數 lcg 產生隨機數的效果圖

可以看出,針對不同的引數,lcg產生的效果差別很大

以下是針對不同環境下的引數選擇

詳見wiki

def lcg(modulus, a, c, seed):

while true:

seed = (a * seed + c) % modulus

yield seed

djb2是乙個產生隨機分布的的雜湊函式,與lcg的演算法相似。

以下是 djb2 的雜湊函式:

x = (a * x) + c; // "mod m", m = 2^32 或 2^64

// generates a hash value for a sting

// same as djb2 hash function

//構造雜湊函式 f(hash)= hash * 33 + c

unsigned int countminsketch::hashstr(const char *str)

return hash;

}

本部分利用djb2處理字串。

其中引數常有以下取值:

m=2^32

m常取乙個較大的質數,以減少衝突。

由於雜湊函式構造簡單,使用移位和相加的操作,所以計算速度快。

要注意hash值的計算,在不同機器上,可能會造成溢位的問題,可以及時對hash值取餘。但是會增加計算開銷,造成hash範圍減小的問題。

乘法易於移位或相加

從移位和加法實現中可以看到,使用33可以複製雜湊累加器中的大多數輸入位,然後將這些位相對地分散開來。這有助於形成好的雪崩現象。使用較大的移位將複製更少的位,使用較小的移位將使位互動更區域性,並使互動擴充套件所需的時間更長。

32 = 2^5,32 與移 5 位相關,有助於將每乙個字串的每一位位元都作用到最終的雜湊值當中

在考慮ascii字元資料時,5的移位是乙個很好的移位量。ascii字元可以看作是4位字元型別選擇器和4位字元型別選擇器。前4位的數字都是0x3。因此,8位移位將導致具有特定含義的位與具有相同含義的其他位相互作用。4位或2位的移位同樣會在相似的位之間產生強烈的互動作用。5位的移位使得乙個字元的4個低階位中的許多位與同一字元的4個上位中的許多強相互作用。

選擇5381並不太重要,很多其他的大的質數數也可以執行地很好。

源自 djb2不是乙個快速雜湊函式,因為它每次處理輸入乙個字元,並且不嘗試使用指令級並行。

在現代處理器,乘法時該演算法要快得多了乘法和其他因素(如2 ^ 13 + 2 ^ 5 + 1)可能也有類似的表現,有更好的輸出,更容易寫。

乙個好的非加密雜湊函式不希望產生隨機輸出。相反,給定兩個幾乎完全相同的輸入,它希望產生完全不同的輸出。

如果你的輸入值是隨機分布的,你不需要乙個好的雜湊函式,你可以使用你輸入的任意一組位元。一些現代雜湊函式(jenkins 3, murmur, probably cityhash)產生的輸出分布比高度相似的隨機輸入更好。

選擇雜湊函式的詳細部落格

乙個簡單的隨機數產生函式

直接先貼上 吧。includenclude const double sample sum 10000000 double random double start,double end 上面這個函式可以產生start到end之間的隨機數,及 start,end 最大值小於end,最小值可以等於sta...

如何產生乙個隨機數

大家可能很多次討論過隨機數在計算機中怎樣產生的問題,在這篇文章中,我會對這個問題進行更深入的 闡述我對這個問題的理解。首先需要宣告的是,計算機不會產生絕對隨機的隨機數,計算機只能產生 偽隨機數 其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能...

乙個簡單的子集產生演算法

在做關聯規則挖掘模組的時候,由頻繁項集產生關聯規則,需要使用到子集產生的演算法。比如 char a 集合a中,產生所有a的子集,這些。在openminer的關聯模組實現之處,我考慮的方法和人們思考產生子集的方法型別,既是先產生所有的單個元素的子集,然後產生2個元素的子集,然後3個的,一直到n個元素的...