【问题标题】:64-bit multiplicative hashing64 位乘法散列
【发布时间】: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 以及如何测试这些东西?

【问题讨论】:

    标签: c hash


    【解决方案1】:

    你这样做是为了锻炼吗?否则,我建议您查看 Bob Jenkin 的 lookup8 和查找系列 (http://burtleburtle.net/bob/hash/) 和 Austin Appleby 的杂音 http://code.google.com/p/smhasher/(速度杀手和我的最爱)等众所周知的哈希函数。好的散列函数很难构建……如果你追求滚动类型的散列,拉宾指纹很难被击败。 如果你真的想自己动手,为了确保你的哈希值合适,请使用 Appleby 和 Jenkins 哈希测试(torture 和 smhasher)

    【讨论】:

      【解决方案2】:

      不确定前两个示例。但是在第三个中,要从代码中获取完整的句点,您需要添加一个奇数。否则这将有一个最大周期为 65537,它可能低至 3。甚至可能有一个固定点。

      无论你在哪里得到 0x3FFFFFFF 一段好时间都是不正确的。 Knuth 的其中一卷非常详细地讨论了这一点。

      乘数必须是 4n+1 的形式,并且必须有一个奇数加数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多