2个坐标的快速散列顺序无关紧要?

Posted

技术标签:

【中文标题】2个坐标的快速散列顺序无关紧要?【英文标题】:Fast hash for 2 coordinates where order doesn't matter? 【发布时间】:2017-01-12 10:45:30 【问题描述】:

是否有一个公式可以将 2 个坐标 (a, b) 和 (c, d) 的单向哈希值转换为一个整数,其中 a、b、c 和 d 为正数?此处的顺序无关,因此当给定(a, b), (c, d)(c, d), (a, b) 时,公式应该给出相同的结果。每个坐标点中实际数字的顺序很重要((a, b)(b, a) 不同)。速度是这里的关键,公式应该很快并且具有 O(1) 复杂度。

注意 - 我现在正在做的是使用 Python 在 sort 中的构建对两个坐标进行排序,然后将它们用作 Python 内置字典中的键(因此,内置散列)。我需要一种更快的方法来执行此操作,以便我可以自己将两个坐标散列为一个整数。

【问题讨论】:

你的坐标有最大值吗? 不,对 x 或 y 值都没有限制。 对碰撞有什么要求吗?也许你可以手动对它们进行排序,而不是使用 python 排序,这对于像你这样的小列表有一些开销。 我宁愿不解决冲突,因为这会花费额外的时间。但是,我将手动对它们进行排序 - 这是有道理的。感谢您的建议。 坐标是整数吗? 【参考方案1】:

您可以为此使用hash() 或frozenset。

>>> hash(frozenset([(10, 20), (11, 22)]))
1735850283064117985
>>> hash(frozenset([(11, 22), (10, 20)]))
1735850283064117985

Frozensets 是专门为这种用例设计的(即,frozensets 本质上是不可变和可散列的无序集合)。

希望这个答案能让您获得所需的权利:-)

【讨论】:

哦,我不知道冷冻套装。谢谢!

以上是关于2个坐标的快速散列顺序无关紧要?的主要内容,如果未能解决你的问题,请参考以下文章

在不更改属性顺序的情况下获取 XML

散列查找

在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要

Metal2剖析:OIT顺序无关透明渲染[Imageblock]

随机化快排和决策树

如果记录顺序无关紧要,我可以使用单个 Kinesis 分片并行调用 Lambda 函数吗?