我通过获取标识数据的几条(SHA256::Update函数,该函数可让您一次添加片段:
#include "sha.h"
...
byte outputBuf[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256 hash;
hash.Update(pData1, lenData1); // pData* can point to int, double or std::string
hash.Update(pData2, lenData2);
...
hash.Final(outputBuf);
我注意到对
Update
的调用顺序很重要(即,如果更改两个Update
语句的顺序,则会得到不同的哈希值)。我希望这是顺序无关的。所以:xor
组合参数将可行。一个问题是,如果两个数据相同,它们将被抵消。您可以预见与此相关的问题吗? 最佳答案
如果您认为{1, 2}
和{2, 1}
是不同的输入,那么说xor会增加冲突次数的评论是正确的。我猜您不会,否则您将不需要顺序无关的哈希。所以h({1, 2}) = h({2, 1})
不会冲突,因为您要提供相同的输入。
最简单的解决方案是排序,而不是使用您喜欢的哈希函数。它和您的哈希函数一样安全(如果需要,请在crypto.stackexchange.com上确认)。
异化散列绝对不是一个好主意,因为两个相等的元素被抵消了。将它们相加会更好,但是如果有两个相等的元素,则最低有效位将为零(如果有四个这样的元素,则两个位将为零,依此类推)。这可能是可以接受的。
请注意,任何这样的方法都是非常不安全的,因为它可以更快地找到冲突(根据要求提供证明)。您可能需要或可能不需要安全性,但不要尝试发明一种安全的方法,因为这实际上是不可能的(每个众所周知的哈希函数背后都有很多工作日的分析工作)。