首页 > 解决方案 > 散列质量在位上不是恒定的

问题描述

我正在尝试从 32 位输入中导出伪随机 32 位值。

为此,我使用了这个杂音哈希:

uint32_t murmur(uint32_t key, uint32_t seed)
{
        uint32_t k = ( key ^ seed ) * 0x5bd1e995;
        k = k ^ (k>>24);
        return k;
}

令我惊讶的是,与高 16 位相比,低 16 位的随机性质量存在很大差异。

如果我使用最低 16 位生成随机单位向量,我会在球体上得到清晰的图案,极点和子午线可见。

在此处输入图像描述

如果我使用最高 16 位生成随机单位向量,我会得到更好的点分布。

在此处输入图像描述

这是 MURMUR 的一个基本问题,还是我用错了?

我提供给它的关键是值 [0,1,.. N] 乘以大素数 2521008887。

对于 3D 矢量的 x/y/z 坐标,我使用随机选择的种子 0xb7295179、0x18732214、0x9531f133。

0xffff0000 位的随机性直观地检查出来。0x0000ffff 位的随机性不会。

标签: randommurmurhash

解决方案


推荐阅读