数组的顺序不敏感的哈希函数

问题描述 投票:0回答:3

我正在寻找一个哈希函数,它将为包含相同元素的无序序列产生相同的结果。

例如:

Array_1: [a, b, c]
Array_2: [b, a, c]
Array_3: [c, b, a]

哈希函数应该为每个数组返回相同的结果。

如何实现这一目标?

最流行的答案是按某种规则对元素进行排序,然后连接,然后进行哈希。

还有其他方法吗?

arrays hash cryptography sequence
3个回答
1
投票

如果 a、b、c 是数字,您可以求和,然后根据总和构建哈希。 你也可以乘法。 但要注意零! 对数字进行异或运算也是一种方法。

对于非常小的数字,您可以考虑设置由数字索引的位。这意味着构建一个长(64 位)作为哈希的输入仅允许 0-63 范围内的元素编号。

拥有的元素越多,发生的碰撞就越多。 最后,您将具有 m 位的 n 元素(导致 2^(m*n) 范围)映射到具有 k 位的哈希值。 通常 m 和 k 是常数,但 n 会变化。

请注意,任何通过哈希进行的访问都需要测试是否获得正确的元素。一般来说,哈希值不是唯一的。

否则对元素进行排序,然后按照建议进行散列

关于 CodesInChaos 的评论:

为了能够省略测试,散列的位数应远大于元素位数的总和。至少还要多说64位。一般不会出现这种情况。

安全哈希/唯一 ID 的一个常见情况是 GUID。这实际上意味着 128 位。 文本字符的随机序列在 20-25 个字符内达到此位数。 较长的文本很可能会产生冲突。这是否仍然可以接受取决于用例。


0
投票
XOR | Sum | Sum of squares | ...

哪里 |表示连接。

XOR of hash of elements

0
投票

为了具有顺序独立性,您需要既可交换又可结合的组合操作。 XOR 和 ADD 是不错的选择,但可能会导致太多冲突。

如果您的 64 位数字是均匀分布的,并且您的输出哈希是 64 位或更少,那么您可以(或需要)做的不多 - 在这种情况下,XOR 和 ADD 将接近最佳值。但是,如果您的 64 位数字不是均匀分布的,或者您有超过 64 位的输出,则可以通过首先对每个输入数字(独立地)使用高扩散变换来改进,然后再将它们与 XOR 或 ADD 组合。

基本上,这只是从 64 位数字到 k 位数字(其中 k 是输出哈希大小)的映射,这样对于任何给定的 64 位输入,翻转一位将翻转 k 个输出位的大约一半。有很多方法可以做到这一点,但几乎任何好的加密转换都可以。

© www.soinside.com 2019 - 2024. All rights reserved.