Java String简短哈希码

zvi*_*fer 1 java hash

我想使用hashCode()String对象的java标准函数"实现"从Strings到short的哈希函数.我想出了以下简单的实现:

static short shortHashCode(String str)
{
   int strHashCode = str.hashCode();
   short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE);
   return shorterHashCode;
}
Run Code Online (Sandbox Code Playgroud)
  1. 我的shortHashCode函数是一个很好的哈希函数吗?意思是碰撞的机会很小(两个不同的字符串有相同的哈希码接近1/Short.MAX_VALUE的可能性)?
  2. 有没有更好的方法来实现从字符串到短路的哈希函数?

Mik*_*uel 5

(short) (strHashCode % Short.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

正在不必要地丢失信息.

 (short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));
Run Code Online (Sandbox Code Playgroud)

不会,但无论如何都是等价的

 (short) strHashCode
Run Code Online (Sandbox Code Playgroud)

因为将整数类型转换为较小的整数类型只会截断最高有效位.


它还假设所有位具有相同的熵,这可能不是真的.你可以尝试并传播熵:

 (short) (strHashCode ^ (strHashCode >>> 16))
Run Code Online (Sandbox Code Playgroud)

它将高16位与低16位进行异或运算.


意思是碰撞的机会很小(两个不同的字符串有相同的哈希码接近1/Short.MAX_VALUE的可能性)?

java.lang.String.hashCode不是加密强哈希函数,因此如果攻击者无法控制一个或两个输入来强制冲突,它只具有该属性.

如果将其暴露给来自不受信任来源的字符串,您可能会看到更高的哈希冲突率,可能允许攻击者拒绝服务.

此外,它旨在权衡碰撞率的小幅增加,以获得更好的性能和跨版本稳定性.那里有更好的字符串散列函数.