C++ 顺序无关散列 我用几条密钥来创建键值数据(< P>注释,即XOR将增加冲突的次数是唯一的,如果您考虑 { 1, 2 } 和 { 2, 1 } /代码>是不同的输入。我猜,您不需要,否则,您将不需要与命令无关的哈希。所以 H({ 1, 2 })=H({ 2, 1 })。没有冲突,因为您提供的是相同的输入

C++ 顺序无关散列 我用几条密钥来创建键值数据(< P>注释,即XOR将增加冲突的次数是唯一的,如果您考虑 { 1, 2 } 和 { 2, 1 } /代码>是不同的输入。我猜,您不需要,否则,您将不需要与命令无关的哈希。所以 H({ 1, 2 })=H({ 2, 1 })。没有冲突,因为您提供的是相同的输入,c++,hash,crypto++,C++,Hash,Crypto++,最简单的解决方案是排序,而不是使用您喜爱的哈希函数。它与您的哈希函数一样安全(如果您愿意,请在crypto.stackexchange.com上确认) Xoring哈希肯定是个坏主意,因为两个相等的元素相消。将它们相加要好得多,但对于两个相等的元素,最低有效位将为零(对于四个这样的元素,两位将为零,等等)。这可能是可以接受的 请注意,任何这样的方法都是非常不安全的,因为它允许更快地查找冲突(根据请求进行验证)。您可能需要也可能不需要安全性,但不要试图发明一种安全方法,因为这实际上是不可能的(每个

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

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


请注意,任何这样的方法都是非常不安全的,因为它允许更快地查找冲突(根据请求进行验证)。您可能需要也可能不需要安全性,但不要试图发明一种安全方法,因为这实际上是不可能的(每个众所周知的哈希函数背后都有许多人月的分析)。

几乎所有好的哈希(即使是非加密的)将是顺序相关的。否则,它将以非常规则的模式导致可预见的冲突,这是不好的。对每个数据块单独进行一次哈希,然后将结果一起进行
^
。当然,这很可怕,并且在一个好的哈希中缺少许多您想要的功能,但它是一个顺序无关的哈希。只需提供一个函数即可n获取命名参数(或具有命名成员的结构),让函数担心散列顺序。任何使散列顺序独立的方法都会增加冲突,可能会非常显著。顺序独立不仅会显著增加冲突数量,而且会显著增加冲突数量(因为N字节有N!个置换,20!大约是10^18)。但更糟糕的是,正如前面提到的,不仅存在冲突,而且它们以一种模式发生。还要注意“缺点”对于每个交换操作,都存在使用xor作为散列的方法。逆元素总是会被抵消。对于xor,这恰好是一个相同的块,但对于每个交换操作(例如,
a+b+(-b)=a
),它是相同的(具有一些不同的值)。这就是它的工作原理。这个问题似乎离题了,因为它更适合crypto.stackexchange.com或security.stackexchange.com。
#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);