我想"实现"一个从字符串到短裤的哈希函数,使用java标准的字符串对象的hashCode()
函数。我想出了下面这个简单的实现:
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位进行XORs。
意思是碰撞的机会小(两个不同的字符串将有相同的哈希码接近1/Short.MAX_VALUE的机会)?
java.lang.String.hashCode
不是一个加密强哈希函数,所以只有当攻击者无法控制一个或两个输入来强制冲突时,它才具有该属性。
如果您将它暴露给来自不受信任来源的字符串,您可能会看到更高的哈希冲突率,可能允许攻击者拒绝服务。
同样,它的设计是为了更好的性能和跨版本稳定性而权衡碰撞率的小幅增加。还有更好的字符串散列函数