3

我正在为键值数据创建键,方法是获取几条 (<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语句的顺序,您将得到不同的哈希)。我希望这与订单无关。所以:

  • CryptoPP 是否提供了一种方法来做到这一点?
  • 如果没有,你能建议一种替代方法吗?到目前为止,我认为使用xor组合参数会起作用。一个问题是,如果两条数据相同,它们就会相互抵消。你能预见到这方面的问题吗?
4

1 回答 1

2

{1, 2}如果您考虑和{2, 1}不同的输入,则评论说 xor 会增加碰撞次数是正确的。我想,你不需要,否则你不会想要一个与顺序无关的哈希。h({1, 2}) = h({2, 1})当您提供相同的输入时,也不会发生冲突。

最简单的解决方案是排序,而不是使用您最喜欢的哈希函数。它与您的哈希函数一样安全(如果您愿意,请在 crypto.stackexchange.com 上确认)。

异或哈希绝对是一个坏主意,因为两个相等的元素抵消了。添加它们要好得多,但是对于两个相等的元素,最低有效位将为零(对于四个这样的元素,两位将为零,等等)。这可能是可以接受的。

请注意,任何此类方法都非常不安全,因为它可以更快地发现冲突(根据要求提供证明)。您可能需要也可能不需要安全性,但不要试图发明一种安全的方法,因为这实际上是不可能的(每个众所周知的散列函数背后都有许多人工月的分析)。

于 2017-06-07T14:24:36.743 回答