Java 字符串到短哈希码

标签 java hash

我想使用 String 对象的 java 标准 hashCode() 函数“实现”一个从 Strings 到 shorts 的散列函数。我想出了以下简单的实现:

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 位异或。


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/

相关文章:

java - 在 Spring MVC 中包含 View

ruby-on-rails - 在Ruby on Rails中为每个用户分配一个唯一的100个字符的哈希

python - 在 python 3 中散列数组或对象

php - 对数据库中的密码进行加密

php - laravel php pbkdf2 登录验证

java - 通过 DNS 名称访问托管在单个服务器中的多个网站

java - JDK 11.0.2 - 无法在 ECLIPSE 中派生模块描述符

java - 新手程序员需要建议 : "String index out of range" - Java

Java 密码学 - 真的这么难吗?lic

perl - 如何索引一个哈希