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

Arrays 数组的顺序不敏感哈希函数,arrays,hash,cryptography,sequence,Arrays,Hash,Cryptography,Sequence,我正在寻找一个哈希函数,它将为包含相同元素的无序序列生成相同的结果 例如: Array_1: [a, b, c] Array_2: [b, a, c] Array_3: [c, b, a] 哈希函数应该为每个数组返回相同的结果 如何做到这一点 最流行的答案是按照某种规则对元素进行排序,然后连接,然后进行散列 还有其他方法吗?如果a、b、c是数字,可以求和,然后在求和的基础上构建散列。 你也可以乘。 但是要注意零! 对数字进行异或运算也是一种方法 对于非常小的数字,可以考虑设置由数字索引的位。这

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

例如:

Array_1: [a, b, c]
Array_2: [b, a, c]
Array_3: [c, b, a]
哈希函数应该为每个数组返回相同的结果

如何做到这一点

最流行的答案是按照某种规则对元素进行排序,然后连接,然后进行散列


还有其他方法吗?

如果a、b、c是数字,可以求和,然后在求和的基础上构建散列。 你也可以乘。 但是要注意零! 对数字进行异或运算也是一种方法

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

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


请注意,哈希的任何访问都需要测试是否获取正确的元素。通常,哈希不是唯一的

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

关于CodesInChaos的评论:

为了能够省略测试,散列的位数应该远远大于元素位的总和。至少多说64位。一般来说,没有给出这种情况

安全哈希/唯一id的一种常见情况是guid。这意味着有效的128位。 文本字符的随机序列达到20-25个字符的位数。 较长的文本很可能产生冲突。这取决于用例是否仍然可以接受

XOR | Sum | Sum of squares | ...
其中|表示concat


我认为与XOR的冲突太多了。特别是如果a,b,c是很小的整数,比如0,1,2等等。当然在这种情况下,排序是个好主意。但我正试图为这种情况找到一些通用的散列方法。这些要求意味着冲突。“请注意,散列的任何访问都需要测试是否获得正确的元素。”如果是安全的加密散列,则不需要该测试,因为发现碰撞太难了/发生碰撞的可能性微乎其微。你能解释一下你不喜欢最流行的选择吗?这可能有助于我们回答这个问题。任何交换函数都会将给定的元素组合起来,得到一个顺序不敏感的结果。然后,您可以对输出执行任何进一步的处理?对抗攻击者的碰撞?或者只是没有意外碰撞?@DuncanJones最流行的选项需要排序,这样繁重的操作不应该在散列函数中。什么是a、b和c?你们有多少种不同的a、b、c?数组中的元素数是常数吗?a、b、c等可以在编译时知道吗?如果你能提供一个更好的答案,它看起来很好,但我们有证据证明这一点吗?可能发生碰撞吗?
XOR of hash of elements