【问题标题】:Will the hashcode of a String will be the same for the Entire Application?整个应用程序的字符串哈希码是否相同?
【发布时间】:2012-10-28 06:59:44
【问题描述】:

我正在开发一个基于散列的程序。 我的问题是字符串的 HashCode 是否会在整个应用程序中保持不变。

我问这个的原因是,Mecached Servers 中的 KetamaMemcachedSessionLocator 以这种方式工作 如果有两台服务器正在运行 Memcache,我想从特定服务器中找到一个密钥。

String key = "MyString";
int keyid = key.hashCode();
int v = keyid % 1;  //( I assume that this will contact the First Server to retrieve that value )
int v = keyid % 2;  //( I assume that this will contact the Second Server to retrieve that value )
String value = MemcachedClient.get(key, v);

以下基于本网站实现上述内容

http://dev.mysql.com/doc/refman/5.0/en/ha-memcached-using-hashtypes.html

请分享您的意见,如果您发现任何问题,如果上述方式有效。

【问题讨论】:

    标签: java


    【解决方案1】:

    根据哈希码合约,如果string1.eqauls(string2) 将始终相同

    The java.lang.String hash function

    为了提供一个快速的实现,Java String 类的早期版本提供了一个 hashCode() 实现,它最多考虑从字符串中挑选的 16 个字符。对于一些常见的数据,这种方法的效果很差,产生了令人无法接受的集群结果,从而降低了哈希表的性能。

    从 Java 1.2 开始,java.lang.String 类使用乘积和算法对整个字符串文本实现其 hashCode()。例如,给定 java.lang.String 类的实例 s,其哈希码 h(s) 由

    定义

    其中项使用 Java 32 位 int 加法求和,s[i] 表示字符串的第 i 个字符,n 是 s 的长度。

    与任何一般的散列函数一样,冲突是可能的。例如,字符串“FB”和“Ea”具有相同的哈希值。 String 的 hashCode() 实现使用素数 31,'a' 和 'B' 的差值只有 31,所以计算为 70 × 31 + 66 = 69 × 31 + 97。

    检查Collections Framework Enhancements in Java SE 7,您会看到其中有变化,谁知道会发生变化。

    替代散列函数仅适用于字符串类型的键。

    【讨论】:

    • 碰撞在这里不是问题,而且我使用的是 Java 1.6,有一年我们将无法更改 Java 版本,所以我会采用这种方法。谢谢。
    【解决方案2】:

    是和不是。

    hashCode() 合约指定两个相等的字符串在同一个 JVM 中具有相同的哈希码。这意味着只要字符串不改变,代码就不会改变。

    另一方面,实际的hashCode() 实现已经从一个 JVM 版本更改为另一个版本和/或从一个 JVM 供应商更改为另一个。例如,Oracle Java 7u6 provides a faster alternative hashing function 表示大于特定大小的字符串。目前它仅在 Collections 框架中使用,但它很可能成为 Java 8 的系统范围的默认设置。

    基本上,您可以依赖hashCode() 在同一个应用程序内保持一致,但在不同应用程序实例之间却不能。如果您打算存储或共享哈希码,您可能应该实现自己的函数。

    另一个潜在的兴趣点是,Java 中定义的 hashCode()int,即 32 位长。这绝不是一个唯一的标识符——冲突非常频繁,程序员应该处理它们。如果您的存储系统依赖于唯一键,您可能希望使用更强的哈希函数,例如SHA-2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2013-08-16
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多