Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 64位乘法哈希_C_Hash - Fatal编程技术网

C 64位乘法哈希

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;

我正在研究快速64位哈希。许多现有的安全散列函数速度太慢,一些像FNV这样的非加密散列函数就是不好

我想出了一个类似FNV的杂烩:

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,并且必须有奇数加数