首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建自定义Murmur Avalanche Mixer?

如何创建自定义Murmur Avalanche Mixer?
EN

Stack Overflow用户
提问于 2017-07-20 15:11:52
回答 1查看 630关注 0票数 5

我试图使用雪崩混频器散列整数坐标。我一直在使用Murmur3 32位和64位雪崩混频器(而不是实际的总哈希函数)。对于我的应用程序,不需要整个散列函数,只需要在这里看到的Avalanche:

代码语言:javascript
运行
复制
uint32_t murmurmix32( uint32_t h )
{
  h ^= h >> 16;
  h *= 0x85ebca6b;
  h ^= h >> 13;
  h *= 0xc2b2ae35;
  h ^= h >> 16;

  return h;
}


uint64_t murmurmix64( uint64_t h )
{
  h ^= h >> 33;
  h *= 0xff51afd7ed558ccdULL;
  h ^= h >> 33;
  h *= 0xc4ceb9fe1a85ec53ULL;
  h ^= h >> 33;

  return h;
}

这些在我的机器上很快出现,我拿两个uint32_ts并将它们混合到这些函数中产生雪崩的结果,这就产生了一个我喜欢的psuedorandom分布。

我想在这个系统中引入更多的坐标(即z和w),所以我想使用更大的雪崩混合器来散列我的坐标。我相信我想看到的函数本身的最大值是uint64_t,碰撞本身并不是问题,但是结果的随机性是。

似乎murmur3没有一个比64更大的雪崩混合器。我查看了本网站这一个,以获得一些关于其他雪崩散列的线索:

这些雪崩的质量似乎足以满足我的申请,但我特别感兴趣的是曼城哈希的低语灵感。

在CityHash中,他们有一个“低语启发”的混合器:

代码语言:javascript
运行
复制
uint64 Hash128to64(const uint64_t& x_high, const uint64_t& x_low) {
  // Murmur-inspired hashing.
  const uint64 kMul = 0x9ddfea08eb382d69ULL;
  uint64 a = (x_low ^ x_high) * kMul;
  a ^= (a >> 47);
  uint64 b = (x_high ^ a) * kMul;
  b ^= (b >> 47);
  b *= kMul;
  return b;
}

对于两个64位数来说,这看起来相当快。我搞不懂他们是如何从Murmur派生出自己的“灵感”散列的。如何创建自己的2^n位杂音雪崩混频器?

EN

回答 1

Stack Overflow用户

发布于 2020-07-11 18:38:17

Pelle Evensen已经回答了你的问题,“如何创建一个定制的Murmur Avalanche Mixer",他在mostlymangling.blogspot.com上的博客文章中,特别是以下两个:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45218741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档