我正在创建键值数据的密钥,方法是获取一些(<10)条信息来识别数据并从中产生一个哈希值。为此,我一直在使用CryptoPP的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
来组合参数会起作用。一个问题是,如果两个数据相同,它们将被取消。你能预见到这个问题吗?答案 0 :(得分:2)
如果您认为{1, 2}
和{2, 1}
是不同的输入,则评论说xor会增加冲突次数。我想,你不会,否则你不会想要一个与订单无关的哈希。因此,当您提供相同的输入时,h({1, 2}) = h({2, 1})
不会发生冲突。
最简单的解决方案是排序,而不是使用您喜欢的哈希函数。它与您的哈希函数一样安全(如果您愿意,请在crypto.stackexchange.com上确认)。
Xoring哈希绝对是一个坏主意,因为两个相等的元素被抵消了。添加它们要好得多,但是有两个相等的元素,最低有效位将为零(有四个这样的元素,两个位将为零,等等)。这可能是可以接受的。
请注意,任何此类方法都非常不安全,因为它可以更快地找到碰撞(根据要求提供证据)。您可能需要也可能不需要安全性,但不要试图发明一种安全的方法,因为它实际上是不可能的(每个众所周知的哈希函数都有很多人工月的分析)。