字符串的哈希码对于整个应用程序是否相同?

Paw*_*wan 5 java

我正在开发一个基于Hashing的程序.我的问题是,字符串的HashCode对于整个应用程序将保持不变.

我问这个的原因是因为,Mecached服务器内部的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);
Run Code Online (Sandbox Code Playgroud)

其次是基于本网站实施上述内容

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

如果您发现上述方式有问题,请分享您的意见.

Ami*_*nde 10

根据哈希码合同,它总是相同的if string1.eqauls(string2)

The java.lang.String hash function

为了提供快速实现,早期版本的Java String类提供了一个hashCode()实现,该实现最多考虑从字符串中挑选出16个字符.对于某些常见数据,这种方法效果很差,提供了不可接受的集群结果,从而降低了散列表性能.

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

 h(s)=\sum_ {i = 0} ^ {n-1} s [i]\cdot 31 ^ {n-1-i}

其中术语使用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你看到它有变化,谁知道会有变化.

替代散列函数仅适用于String类型的键.