哈希函数从整数坐标对中提供唯一的 uint

标签 hash hashtable

一般问题: 我有一个很大的二维点空间,里面稀疏地分布着点。 把它想象成一 block 撒满黑点的白色大 Canvas 。 我必须多次迭代和搜索这些点。 Canvas (点空间)可能很大,接近极限 int 的值及其大小在设置点之前是未知的。

这让我想到了哈希的想法:

理想: 我需要一个采用 2D 点的哈希函数,返回一个唯一的 uint32。 这样就不会发生碰撞。 您可以假设 Canvas 上的点可以通过 uint32 轻松计数。

重要:事先不可能知道 Canvas 的大小 (甚至可能会改变), 所以像

Canvas 宽度 * y + x

很遗憾,这是不可能的。

我也尝试过很天真的

abs(x) + abs(y)

但这会产生太多冲突。

妥协: 提供 key 冲突概率非常的哈希函数。

最佳答案

康托尔的enumeration of pairs

   n = ((x + y)*(x + y + 1)/2) + y

可能很有趣,因为它最接近原始的 canvaswidth * y + x,但适用于任何 x 或 y。但对于现实世界中的 int32 哈希,而不是整数对到整数的映射,您可能最好进行位操作,例如 Bob Jenkin 的 mix并用 x,y 和盐来调用它。

关于哈希函数从整数坐标对中提供唯一的 uint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/682438/

相关文章:

c - 在链接列表中插入和删除

java - 将 null 值保存为多个键,其中 null 具有单一含义

java - 为什么 Java 的 String 中的 hashCode() 使用 31 作为乘数?

c - 结构 |结构/union 的不完整类型错误

php - 当这些数组是映射(又名哈希表)时,如何记录 PHPDoc 中的数组类型?

c++ - 如何在 C++ 中实现通用哈希函数

javascript - 是否有等效于 VB 的 "LIKE #"的 javascript?

java - Java 上的 256 位输出哈希函数

php - 存储phphash密码的数据类型

php - 将 base64 的 SHA1 哈希转换为十六进制哈希