簡體   English   中英

64位乘法哈希

[英]64-bit multiplicative hashing

我正在研究快速64位哈希。 許多現有的安全哈希函數太慢了,某些非加密哈希函數(例如FNV)就很糟糕。

好吧,我想出了類似FNV的哈希:

UINT64 hash=0;

// for each input byte
hash=(hash^(input_byte+1))*HASH_PRIME;

主要問題是關於HASH_PRIME 通常,我們可能會看到乘法哈希的“黃金比例”一詞。 對於64位哈希,黃金分割率是0x9e3779b97f4a7c13

我在PRNG測試了32位黃金時段的黃金比率:

DWORD hash=0;
// loop
hash=(hash^1)*0x9e3779b9;
rnd_out=hash>>24;

一個好的值可能會產生0xFFFFFFFF的周期-即最大可能的周期。 這個黃金比率產生的周期明顯更短。

要不就

DWORD hash=~0;
// loop
hash*=0x9e3779b9;
rnd_out=hash>>24;

同樣,足夠好的乘法器可以產生0x3FFFFFFF字節的周期。 黃金比例在這里又產生了更短的時期。

從未測試過64位素數-計算量太大。

期間對我的哈希值重要嗎? 在哪里可以找到好的64位HASH_PRIMES以及如何測試這種東西?

您是在做練習嗎? 否則,我建議您看一下眾所周知的哈希函數,如鮑勃·詹金(Bob Jenkin)的lookup8和lookup系列( http://burtleburtle.net/bob/hash/ )和奧斯汀·阿普比(Austin Appleby)的雜音http://code.google.com/p/smhasher / (速度殺手,也是我的最愛)。 好的哈希函數很難構建...如果您是滾動式哈希,那么Rabin指紋很難被擊敗。 並且,如果您真的想自己滾動,請確保您的哈希值是適當的,請使用Appleby和Jenkins哈希測試(酷刑和騙子)

不確定前兩個示例。 但是,在第三個代碼中,要使用一整段時間,您需要添加一個奇數。 否則,最大周期為65537,可能低至3。甚至可能有一個固定點。

無論何時何地獲得0x3FFFFFFF都是不正確的。 Knuth的其中一卷對此進行了過多的討論。

乘數的形式必須為4n + 1,並且必須有一個奇數加數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM