我想使用String对象的java标准hashCode()
函数“实现”从Strings到short的哈希函数。我想出了以下简单的实现:
static short shortHashCode(String str)
{
int strHashCode = str.hashCode();
short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE);
return shorterHashCode;
}
shortHashCode
函数是否具有良好的哈希函数?意思是碰撞的可能性很小(两个不同的字符串有相同的哈希码接近1 / Short.MAX_VALUE的可能性)?答案 0 :(得分:5)
(short) (strHashCode % Short.MAX_VALUE);
不必要地丢失信息。
(short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));
不会,但无论如何都会等同于
(short) strHashCode
因为将整数类型转换为较小的整数类型只会截断最高有效位。
它还假设所有位具有相同的熵,这可能不是真的。你可以尝试传播熵:
(short) (strHashCode ^ (strHashCode >>> 16))
将高16位与低16位进行异或。
意思是碰撞的可能性很小(两个不同的字符串有相同的哈希码接近1 / Short.MAX_VALUE的可能性)?
java.lang.String.hashCode
不是cryptographically strong hash function,因此如果攻击者无法控制一个或两个输入来强制发生冲突,那么它只有该属性。
如果将它暴露给来自不受信任来源的字符串,您可能会看到更高的哈希冲突率,可能允许攻击者拒绝服务。
此外,它旨在权衡碰撞率的小幅增加,以获得更好的性能和跨版本稳定性。那里有更好的字符串哈希函数。