Hash 如何评估哈希生成算法

Hash 如何评估哈希生成算法,hash,hashcode,Hash,Hashcode,除了生成大量值并查看值的分布外,您还知道如何评估哈希函数的效率? 效率是指哈希函数生成的键均匀分布。有没有办法在不实际测试实际值的情况下证明这一点?散列函数仅在被散列的数据上下文中才是偶数 考虑两个数据集: 第1组 第2组 对于一个集合,一个好的散列函数(即对于集合1,mod 10)不会产生冲突,并且可以被视为该数据集合的完美散列 然而,如果将其应用到第二个集合,则到处都会发生碰撞 Hash = (x * 37) mod 256 第二盘的情况要好得多,但第一盘可能不太适合。。。特别是在对散列进

除了生成大量值并查看值的分布外,您还知道如何评估哈希函数的效率?
效率是指哈希函数生成的键均匀分布。有没有办法在不实际测试实际值的情况下证明这一点?

散列函数仅在被散列的数据上下文中才是偶数

考虑两个数据集:

第1组

第2组

对于一个集合,一个好的散列函数(即对于集合1,mod 10)不会产生冲突,并且可以被视为该数据集合的完美散列

然而,如果将其应用到第二个集合,则到处都会发生碰撞

Hash = (x * 37) mod 256
第二盘的情况要好得多,但第一盘可能不太适合。。。特别是在对散列进行分区时,例如对少量的桶进行分区

您可以做的是根据“期望”函数必须处理的随机数据计算哈希。。。但这是在做假设

过早优化是在你有足够的真实数据来进行评估之前寻找完美的散列函数

您应该在重新灰化的成本变得无法更改哈希函数之前获得足够的数据

更新 假设我们正在寻找一个哈希函数,该函数生成输入数据的8位哈希。让我们进一步假设散列函数应该采用不同长度的字节流

如果我们假设字节流中的字节是均匀分布的,我们可以对不同的哈希函数进行一些评估

int hash = 0;
for (byte b in datastream) hash = hash xor b;
此函数将为指定的数据集生成均匀分布的哈希值,因此在本上下文中是一个很好的哈希函数。如果你不明白这是为什么,那么你可能会有其他问题

int hash = 37;
for (byte b in datastream hash = (31 * hash + b) mod 256;
此函数将为指定的数据集生成均匀分布的哈希值,因此在本上下文中是一个很好的哈希函数

现在,让我们将数据集从0到255范围内随机数的可变长度字符串更改为可变长度字符串,该字符串由编码为US-ASCII的英语句子组成

然后,XOR是一个糟糕的散列,因为输入数据从未设置过第8位,因此只生成0-127范围内的散列。此外,由于英语单词中的字母频率和XOR的取消影响,某些“热”值的可能性更高


这对素数作为散列函数仍然相当好,因为它使用完整的输出范围,并且素数初始偏移量加上不同的素数乘法器往往会将值分散开来。但由于英语语言的结构,它仍然很弱。。。只有用真实数据测试才能证明这一点。

这是密码学家在数学课上学习的内容。在任何情况下,这都不是琐碎的事情。是的,但这也是通过试验和测试。我更感兴趣的是一些验证哈希函数效率的方法,而不是在样本上实际尝试它并从中得出结论。那么你就没有领会我的意思了。如果不参考散列函数所处理的数据,您认为散列函数的效率是多少?让我们假设我们有“随机”数据,是随机长度的字节字符串,所有位随机打开或关闭。几乎所有的散列函数都几乎可以完美地处理这样的数据,甚至是一个简单的异或。。。但是,如果使用US-ASCII文本,
xor
就会作为无用的东西消失。我们可以在该上下文中对
xor
散列进行一些分析,但只能通过做出假设
int hash = 0;
for (byte b in datastream) hash = hash xor b;
int hash = 37;
for (byte b in datastream hash = (31 * hash + b) mod 256;