C 64位乘法哈希
我正在研究快速64位哈希。许多现有的安全散列函数速度太慢,一些像FNV这样的非加密散列函数就是不好 我想出了一个类似FNV的杂烩:C 64位乘法哈希,c,hash,C,Hash,我正在研究快速64位哈希。许多现有的安全散列函数速度太慢,一些像FNV这样的非加密散列函数就是不好 我想出了一个类似FNV的杂烩: UINT64 hash=0; // for each input byte hash=(hash^(input_byte+1))*HASH_PRIME; 主要问题是关于哈希素数的。通常,我们可以看到乘法散列的“黄金比率”术语。 对于64位散列,黄金分割比是0x9e3779b97f4a7c13 我在PRNG中测试了周期的32位黄金比率: DWORD hash=0;
UINT64 hash=0;
// for each input byte
hash=(hash^(input_byte+1))*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;
同样,一个足够好的乘法器可以产生0x3fffff
字节的周期。这里的黄金比率再次产生更短的周期
从未测试过64位素数-计算成本太高
周期对我的杂烩很重要吗?在哪里可以找到一个好的64位
哈希素数以及如何测试这些东西?你这样做是为了练习吗?否则,我建议大家看看著名的散列函数,比如Bob Jenkin的lookup8和lookup family()和Austin Appleby的Murruit(一个速度杀手,也是我最喜欢的)。好的散列函数很难构建。。。如果你在寻找一种滚动式散列,拉宾指纹很难被击败。
如果你真的想自己做,为了确保你的哈希值是合适的,可以使用Appleby和Jenkins哈希测试(酷刑和smhasher)前两个例子不确定。但是在第三种情况下,要从代码中得到一个完整的周期,需要添加一个奇数。否则,这将有一个最大周期65537,它可能低至3。甚至可能有一个固定点
无论您在何处获得的0x3FFFFFFF有效期都是不正确的。Knuth的一本书对此进行了过多的详细讨论
乘法器的形式必须为4n+1,并且必须有奇数加数