繁体   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