【发布时间】:2016-08-18 04:59:28
【问题描述】:
我正在研究快速 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 以及如何测试这些东西?
【问题讨论】: