繁体   English   中英

Java String到短哈希码

[英]Java String to short hash code

我想使用String对象的Java标准hashCode()函数从字符串到短裤“实现”哈希函数。 我提出了以下简单实现:

static short shortHashCode(String str)
{
   int strHashCode = str.hashCode();
   short shorterHashCode = (short) (strHashCode % Short.MAX_VALUE);
   return shorterHashCode;
}
  1. 我的shortHashCode函数是一个好的哈希函数吗? 这意味着发生冲突的可能性很小(两个不同的字符串有相同的哈希码接近1 / Short.MAX_VALUE的机会)吗?
  2. 有没有更好的方法来实现从字符串到短裤的哈希函数?
(short) (strHashCode % Short.MAX_VALUE);

正在不必要地丢失信息。

 (short) (strHashCode % ((Short.MAX_VALUE + 1) << 1));

不会,但是等同于

 (short) strHashCode

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


它还假定所有位具有相同的熵,这可能不是正确的。 您可以尝试将熵传播到周围:

 (short) (strHashCode ^ (strHashCode >>> 16))

将高16位与低16位进行XOR运算。


这意味着发生冲突的可能性很小(两个不同的字符串有相同的哈希码接近1 / Short.MAX_VALUE的机会)吗?

java.lang.String.hashCode并不是一种加密功能强大的哈希函数 ,因此只有在攻击者无法控制一个或两个输入来强制发生冲突时,它才具有该属性。

如果将其暴露给来自不受信任来源的字符串,则可能会看到更高的哈希冲突率,这可能使攻击者拒绝提供服务。

此外,它还旨在权衡碰撞率的小幅提高,以获得更好的性能和跨版本稳定性。 有更好的字符串哈希函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM