什么整数哈希函数可以接受整数哈希键?

2024-04-22

什么整数哈希函数可以接受整数哈希键?


我发现以下算法提供了非常好的统计分布。每个输入位以大约 50% 的概率影响每个输出位。不存在冲突(每个输入都会产生不同的输出)。除非 CPU 没有内置整数乘法单元,否则该算法速度很快。 C 代码,假设int是 32 位(对于 Java,替换>> with >>>并删除unsigned):

unsigned int hash(unsigned int x) {
    x = ((x >> 16) ^ x) * 0x45d9f3b;
    x = ((x >> 16) ^ x) * 0x45d9f3b;
    x = (x >> 16) ^ x;
    return x;
}

幻数是使用以下公式计算的特殊的多线程测试程序 https://github.com/h2database/h2database/blob/master/h2/src/test/org/h2/test/store/CalculateHashConstant.java运行多个小时,计算雪崩效应(如果单个输入位发生更改,则输出位的数量发生变化;平均应接近 16)、输出位变化的独立性(输出位不应相互依赖) ,以及如果任何输入位发生变化,每个输出位发生变化的概率。计算出的值比使用的 32 位终结器更好杂音哈希 https://code.google.com/p/smhasher/wiki/MurmurHash3,并且几乎与使用时一样好(不完全)AES http://en.wikipedia.org/wiki/Advanced_Encryption_Standard。一个小小的优点是相同的常量被使用两次(它确实使我上次测试时的速度稍微快一些,不确定是否仍然如此)。

如果替换,您可以反转该过程(从哈希中获取输入值)0x45d9f3b with 0x119de1f3 (the 乘法逆元 https://lemire.me/blog/2017/09/18/computing-the-inverse-of-odd-integers/):

unsigned int unhash(unsigned int x) {
    x = ((x >> 16) ^ x) * 0x119de1f3;
    x = ((x >> 16) ^ x) * 0x119de1f3;
    x = (x >> 16) ^ x;
    return x;
}

对于 64 位数字,我建议使用以下内容,即使它可能不是最快的。这个是基于分割混合64 http://xorshift.di.unimi.it/splitmix64.c,这似乎是基于博客文章更好的位混合 http://zimbry.blogspot.it/2011/09/better-bit-mixing-improving-on.html(混合13)。

uint64_t hash(uint64_t x) {
    x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
    x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
    x = x ^ (x >> 31);
    return x;
}

在这种情况下,反转就更复杂了:

uint64_t unhash(uint64_t x) {
    x = (x ^ (x >> 31) ^ (x >> 62)) * UINT64_C(0x319642b2d24d8ec3);
    x = (x ^ (x >> 27) ^ (x >> 54)) * UINT64_C(0x96de1b173f119089);
    x = x ^ (x >> 30) ^ (x >> 60);
    return x;
}

以上所有内容均适用于 C。对于 Java,请使用long, add L为常数,替换>> with >>>并删除unsigned.

更新:您可能还想查看哈希函数探矿者 https://github.com/skeeto/hash-prospector项目,其中列出了其他(可能更好的)常量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么整数哈希函数可以接受整数哈希键? 的相关文章

  • C++ 最大非负整数

    以下内容是否会在所有平台 int 大小等上按预期工作 或者有更容易接受的方法吗 我做了以下的事情 define MAX NON NEGATIVE INT int unsigned int 1 2 我不会通过解释它在做什么来侮辱你的智商 编辑
  • 将信号/槽(QObject)添加到 QGraphicsItem:性能受到影响?

    我想将信号 槽添加到 QGraphicsItem 以便我可以从另一个线程访问 QGraphicsItemObjects 我知道有两个选项 使用 QGraphicsObject 或从 QObject 和 QGraphicsItem 继承 使用
  • 我可以在 WinRT / Windows 8 Store 应用程序中绑定 DynamicObject

    我有以下代码 public class MyClass DynamicObject INotifyPropertyChanged Dictionary
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 类模板的可变参数构造函数模板的特化

    这是一个带有可变参数构造函数的类 它专门用于从临时对象进行复制和移动 template
  • 在 Visual Studio 中调试时向后拖动指令指针

    如需演示 请查看 基本上 我知道这在 Visual Studio Community Edition 2015 中是可能的 我想知道 a 这与 Intellitrace 和 历史调试 有关吗 b 这样做会有副作用吗 或者这只是将指令向后移动
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 找到两个移动物体的更好交点

    我想极大地优化我的算法之一 我将尽力以最好的方式解释它 主题 我们当时处于二维欧几里德系统中t 0 在这个系统中有两个对象 O1 and O2 O1 and O2分别位于点PA and PC O1移动于常数和已知点方向的速度PB 当物体到达
  • 列表框显示类名称而不是值

    我正在开发一个项目 其中用户应该向动物输入值 名称 年龄 性别等 并且用户输入的值应该显示在列表框中 这些类相互继承 以下是继承的工作原理 Animalclass 是所有类的父类 Mammal类继承自Animal class Dog类继承自
  • 创建 .ICS 文件,添加到 Outlook

    我正在创建一个简单的应用程序 允许用户下载 ICS 文件 并将其导入到他们选择的日历应用程序 站点中 我对创建过程感到满意 但对在 Outlook 中打开它们有疑问 将使用C ASP NET进行开发 当我打开一个日历时 它会添加一个新日历
  • 从 WMI 运行 exe 时的网络身份验证

    我有一个 C exe 需要使用 WMI 运行并访问网络共享 但是 当我访问共享时 我收到 UnauthorizedAccessException 如果我直接运行 exe 则可以访问共享 我在这两种情况下都使用相同的用户帐户 我的应用程序有两
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性
  • 通过 boost::python 将 C++ 对象传递给 python 函数

    我想在 C 应用程序中使用嵌入 python 并调用 python 脚本中定义的函数 该函数的参数是一个 C 对象 看我的代码 class Test public void f std cout lt lt sss lt
  • C/C++ 中的最小二乘回归

    如何在 C C 中实现因子分析的最小二乘回归 the黄金标准是LAPACK http www netlib org lapack lug node27 html 你特别想要xGELS

随机推荐

  • 如何检查 iPhone 上的自定义 url 方案?

    我想在我的应用程序中使用自定义 url 方案 例如调用 navigons mobile navigator 首先 我想检查是否安装了 navigon 或者至少检查自定义 url 方案 navigon 是否已注册 有任何想法吗 多谢 看看 U
  • C 函数堆栈布局

    我有一个看起来像这样的函数 int bof char str char buffer 12 strcpy buffer str return 1 我正在尝试覆盖其返回地址 我发现我可以通过使用来做到这一点 例如 memcpy buffer
  • 使用 DTO 和 BO

    我对 DTO BO 的疑问之一是何时传递 返回 DTO 以及何时传递 返回 BO 我的直觉告诉我始终将 NHibernate 映射到 DTO 而不是 BO 并且始终传递 返回 DTO 然后 每当我需要执行业务逻辑时 我都会将 DTO 转换为
  • 在predict.lm()中使用聚类协方差矩阵

    我正在分析一个数据集 其中数据聚集在多个组 区域中的城镇 中 数据集如下所示 R gt df lt data frame x rnorm 10 y 3 rnorm x groups factor sample c 0 1 10 TRUE R
  • 如何调试 Heroku 请求超时错误

    我如何找出导致 heroku 上 h12 超时错误的原因 它在不同的页面 控制器上随机发生 这是我从日志中得到的错误 Processing by UsersController new as HTML 2013 08 15T13 08 54
  • 使用 script/api 更改组件服务 > COM 安全中的访问权限?

    是否有一个 api 可以更改 COM 安全的访问权限 我需要将新值写入 编辑限制 和 编辑默认值 这些是普通的注册表设置吗 找不到如何设置这些条目 快速答案是是 它们是注册表设置 长答案是否 它们不是simple注册表设置 这些值是二进制的
  • 确定线段是否与多边形相交

    如果我在 2D 平面上有一个向量 由 2 个点组成的线 我如何确定它是否穿过多边形 我知道我可以采用构成多边形的每条线并查看是否有相交 但有更好的方法吗 我读过这篇文章如何确定 2D 点是否在多边形内 https stackoverflow
  • 如何从 Swift 3 中的文本视图中删除查找和共享

    我可以使用它删除剪切 复制 粘贴 选择 选择所有内容 override public func canPerformAction action Selector withSender sender Any gt Bool if action
  • 在sqlalchemy中跨不同模块访问相同的db.session

    我对 sqlalchemy 非常陌生 正在尝试找出如何让事情变得更干净和连接 我创建了一个 model base py 文档 在其中创建了一个会话并在表中建立了所有实体 以及关系等 我想创建另一个模块 在其中对 base py 中的实体 表
  • 如果列数据重复,mysql 不会对行进行两次计数

    我正在计算名为 mysql 表的行数ptb profile views 我的桌子看起来像这样 id profile id viewed profile id date time 1 1 6 2 2 6 3 2 6 4 2 6 5 3 6 目
  • pygame初始化framebuffer或x服务器

    我有一个类检查合适的帧缓冲区 它工作得很好 一对计算机 主要是嵌入式旧板 没有帧缓冲区 所以我删除了init self 函数并手动将其设置为在 X 下运行 两种方式都可以在各自的系统上运行 我只是厌倦了每次进行更改时都将其移植 这是工作帧缓
  • 为什么括号会减慢我的 R 程序速度

    我在朋友的代码中发现了一些多余的括号 这确实减慢了执行时间 如果对此有什么解释的话 请查看这个示例代码 Python 也是一种 quesi 解释语言 不会受到此程序的影响 0 370 seconds x lt 0 while x lt 10
  • 尝试将我的应用程序添加到系统设置 -> 隐私和安全 -> 辅助功能列表是应用程序崩溃的原因

    我有一些应用程序 此应用程序必须具有辅助功能 才能使用全局热键 打开辅助功能首选项窗口没有问题 系统设置 gt 隐私和安全 gt 辅助功能 但用户必须手动单击 按钮 才能在硬盘上搜索我的应用程序并将我的应用程序手动添加到列表中 我正在尝试将
  • 为什么浏览器中的 http auth UI 如此糟糕?

    为什么没有注销按钮 为什么没有 您登录的网站 列表 是因为 HTTP 规范有问题吗 如果 Web 开发人员实际上可以依赖 HTTP 身份验证 那么他们的生活会容易得多 就 HTTP 而言 它是无国籍的 http www webopedia
  • 快速CRC算法?

    我想从 ASCII 字符串创建一个 32 位数字 CRC32 算法正是我正在寻找的 但我无法使用它 因为它需要的表太大了 它适用于资源非常稀有的嵌入式系统 那么 对于快速且精简的 CRC 算法有什么建议吗 当冲突的可能性比原始 CRC32
  • 如何在 SSIS 变量中存储“完全限定”和“仅名称”文件名

    我有一个 SSIS 包 其中有一个 Foreach 循环容器 加载静态文件夹中的所有 txt 文件 我将完全限定的文件名作为在连接字符串中使用的变量传递 我现在只需将文件名传递给一个变量以用于执行存储过程 问题是如果我将 Foreach 循
  • 刷新 Passport.js 中的令牌

    我如何在 Passport js 中执行此操作 当访问令牌过期时 您可以使用refresh token 刷新 您的访问权限 并获得另一个 access token 要使用 fresh token 您需要向我们的令牌端点发出 POST 请求
  • spring jndi NamingException:名称 [spring.liveBeansView.mbeanDomain] 未在此上下文中绑定

    我的 web 应用程序与 spring 3 2 4 运行良好 但是当我启动它时 我会得到调试信息 2014 05 20 11 11 47 DEBUG JndiTemplate 150 Looking up JNDI object with
  • 逐行读取文件而不是逐字读取文件

    我正在尝试编写一些代码来扫描输入文件中的回文 但它从每个单词而不是每行获取字符串 一个例子是赛车会显示为racecar 回文或太热而不能叫 回文 但相反它会显示为too 不是回文 hot 不是回文等等 这是我当前正在执行的读取文件的操作 F
  • 什么整数哈希函数可以接受整数哈希键?

    什么整数哈希函数可以接受整数哈希键 我发现以下算法提供了非常好的统计分布 每个输入位以大约 50 的概率影响每个输出位 不存在冲突 每个输入都会产生不同的输出 除非 CPU 没有内置整数乘法单元 否则该算法速度很快 C 代码 假设int是