我正在寻找一个哈希函数,它将为包含相同元素的无序序列产生相同的结果。
例如:
Array_1: [a, b, c]
Array_2: [b, a, c]
Array_3: [c, b, a]
散列函数应该为这些数组中的每一个返回相同的结果。
如何做到这一点?
最流行的答案是按某种规则对元素进行排序,然后连接,然后进行散列。
还有其他方法吗?
我正在寻找一个哈希函数,它将为包含相同元素的无序序列产生相同的结果。
例如:
Array_1: [a, b, c]
Array_2: [b, a, c]
Array_3: [c, b, a]
散列函数应该为这些数组中的每一个返回相同的结果。
如何做到这一点?
最流行的答案是按某种规则对元素进行排序,然后连接,然后进行散列。
还有其他方法吗?
如果 a,b,c 是数字,您可以求和,然后在总和上构建哈希。你也可以倍增。但要注意零!XOR-ing 数字也是一种方法。
对于非常小的数字,您可以考虑设置由数字索引的位。这意味着构建一个 long(64 位)作为散列的输入只允许 0-63 范围内的元素编号。
你拥有的元素越多,你得到的碰撞就越多。最后,您将具有m位的n 个元素(导致 2^(m*n) 范围)映射到具有k位的哈希值。通常 m 和 k 是一个常数,但 n 是变化的。
请注意,通过哈希进行的任何访问都需要测试是否获得正确的元素。一般来说,哈希不是唯一的。
否则对元素进行排序,然后按照建议进行散列
关于 CodesInChaos 的评论:
为了能够省略测试,哈希的位数应该远大于元素位的总和。至少多说 64 位。一般不给出这种情况。
安全哈希/唯一 id 的一种常见情况是 guid。这实际上意味着 128 位。文本字符的随机序列在 20-25 个字符内达到此位数。较长的文本很可能会产生冲突。这是否仍然可以接受取决于用例。
XOR | Sum | Sum of squares | ...
在哪里 | 表示连接。
或者
XOR of hash of elements