[英]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.