【问题标题】:Hash Function for 3 Integers3 个整数的哈希函数
【发布时间】:2016-12-22 07:10:56
【问题描述】:

我有 3 个非负整数和一个数 n,这样

0 <= a <= n, 0 <= b <= n, and 0 <= c <= n. 

我需要一个单向哈希函数,将这 3 个整数映射到一个整数(可以是任何整数,正数或负数)。有没有办法做到这一点,如果有,怎么做?有没有办法让这个函数可以表示为一个简单的数学表达式,其中唯一的参数是 a、b、c 和 n?

注意:我需要这个函数,因为我在 python 的字典中使用 3 个整数的元组作为键,并且使用超过 10^10 键,空格是一个真正的问题。

【问题讨论】:

  • 您已经确定现有的散列算法已经不起作用了?或者使用嵌套字典不是一个可行的解决方案?
  • 我尝试使用嵌套字典,但它们似乎并没有显着提高内存使用率。现有的散列算法确实有效,但速度是一个问题,由于这是一种单向散列并且具有非常具体的限制,我认为可能有一种更快更简单的方法。
  • 散列与否,您仍然会有相同数量的条目 - 您确定是导致问题的关键“深度”吗?
  • 不,我认为这只是 Python 为元组分配了更多的内存:sys.getsizeof((1, 2, 3)) 是 72,而 sys.getsizeof(100000000) 只是 28。
  • 首先想到的是a * (n + 1)^2 + b * (n + 1) + c。它不会碰撞 :) 当然,它取决于最大n,因此它可以适合整数 \ 64 位整数。

标签: hash hashcode


【解决方案1】:

康托尔配对功能(https://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function)怎么样?

让 H(a,b) := .5*(a + b)*(a + b + 1) + b

然后

H(a,b,c) := .5*(H(a,b) + c)*(H(a,b) + c + 1) + c

您提到需要单向哈希,但根据您对内存限制的详细描述,可逆哈希似乎也足够了。

这没有使用 a、b 和 c 上下有界的假设。

【讨论】:

  • 我使用了一个整数版本,当整数太大时你很快就会溢出。我注意到您使用浮点文字 0.5 - 这是使用浮点完成以避免溢出吗?
  • @wcochran 好点子,老实说,我用它来为从 stl 文件(例如 3D 打印)读取的浮点数生成密钥。即使对于遇到溢出的无符号整数,我想这也不是问题,因为您只关心生成大多数唯一键。 (但溢出确实意味着这个哈希不再可逆。)
  • @wcochran 至于关于 0.5 的评论,我实际上将其编码为除以 2(通过参数上的 reinterpret_cast ),然后让溢出发生。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2011-12-30
  • 2017-09-30
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多