我想使用 String 对象的 java 标准 hashCode()
函数“实现”一个从 Strings 到 shorts 的散列函数。我想出了以下简单的实现:
static short shortHashCode(String str)
{
int strHashCode = str.hashCode();
short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE);
return shorterHashCode;
}
- 我的
shortHashCode
函数是一个好的哈希函数吗?意思是冲突的可能性很小(两个不同的字符串具有接近 1/Short.MAX_VALUE 的相同哈希码的可能性)? - 是否有更好的方法来实现从字符串到短裤的哈希函数?
最佳答案
(short) (strHashCode % Short.MAX_VALUE);
正在不必要地丢失信息。
(short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));
不会,但无论如何都等同于
(short) strHashCode
因为将整数类型转换为更小的整数类型只会截断最高有效位。
它还假设所有比特都具有相同的熵,这可能不是真的。您可以尝试散布熵:
(short) (strHashCode ^ (strHashCode >>> 16))
高 16 位与低 16 位异或。
Meaning is the chance of collisions small (chance that two different Strings will have the same hash code close to 1/Short.MAX_VALUE) ?
java.lang.String.hashCode
不是 cryptographically strong hash function ,所以它只有在攻击者无法控制一个或两个输入来强制碰撞时才具有该属性。
如果您将它暴露给来自不受信任来源的字符串,您可能会看到更高的哈希冲突率,可能允许攻击者拒绝服务。
此外,它旨在权衡冲突率的小幅增加以获得更好的性能和跨版本稳定性。有更好的字符串哈希函数。
关于Java 字符串到短哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121302/