订单独立散列

时间:2012-12-11 17:05:43

标签: c++ hash crypto++

我正在创建键值数据的密钥,方法是获取一些(<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来组合参数会起作用。一个问题是,如果两个数据相同,它们将被取消。你能预见到这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果您认为{1, 2}{2, 1}不同的输入,则评论说xor会增加冲突次数。我想,你不会,否则你不会想要一个与订单无关的哈希。因此,当您提供相同的输入时,h({1, 2}) = h({2, 1})不会发生冲突。

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

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

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