以下摘录来自一篇解释由于哈希数据结构中使用的非随机哈希函数而导致拒绝服务(DoS)攻击的可能性的文章.
[...]可以通过利用底层散列算法中的可预测冲突来利用条件.
为了验证它,我经历了Oracle的Java HashMap的参考实现,并且确实发现了一个使用的静态哈希函数:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Run Code Online (Sandbox Code Playgroud)
关于该主题的另一篇论文说:
Tomcat 6.0.32服务器在大约44分钟的i7 CPU时间内解析2 MB的冲突密钥串,因此大约6 kbit/s的攻击者可以使一个i7核心不断忙碌.如果攻击者有千兆连接,他可以保持大约100.000个i7核心忙
我们如何防范此漏洞.此外,对于许多软件,我们使用的是依赖于此实现的开源(Tomcat等).
Object.hashCode()在同一个对象的所有JVM实现上,required 的输出是否相同?
例如,如果"test".hashCode()返回11.4,它是否可能2在1.6上返回运行.或者如果操作系统不同,或者实例之间存在不同的处理器架构,该怎么办?
我也问过类似的问题为string.GetHashCode()在.NET方法.从那时起,我了解到如果我们要在不同的机器上使用它,我们就不能依赖于buit-in类型的哈希代码的隐式实现.因此,我假设Java实现String.hashCode()在不同的硬件配置中也不稳定,并且可能在VM之间表现不同(不要忘记不同的VM实现)
目前,我们正在讨论一种通过散列将字符串安全地转换为Java中的数字的方法,但是散列算法必须在群集的不同节点之间保持稳定,并且要快速评估,因为使用频率很高.我的队友坚持使用原生hashCode方法,我需要一些合理的论据让他们重新考虑另一种方法.目前,我能想到的唯一的机器配置之间(x86和x64)的JVM可能不同的厂商对某些机器(几乎适用于我们的情况下)和字节顺序不同的差异,根据不同的算法是在机器上跑.当然,也可以考虑字符编码.
虽然所有这些事情都浮现在我脑海中,但我并不是百分之百肯定他们中的任何一个都有足够的理由,我很感激你在这方面的专业知识和经验.这将有助于我建立更强大的论据,以支持编写自定义哈希算法.另外,我很欣赏有关实施时不应该做的建议.
我正在开发一个基于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
如果您发现上述方式有问题,请分享您的意见.
在java中,当我使用String作为Hashmap的键时,我得到的结果与我在HashMap中使用字符串hashcode作为键时的结果略有不同.
任何见解?
在我说Java的时候.
String str= "abcd";
str.hashCode();
Run Code Online (Sandbox Code Playgroud)
我的问题是什么时候计算Hashcode?@第1行或@第2行?
我假设,哈希码是预先计算的.每当更新字符串时,哈希码也可能"更新".
或者它的另一种方式,即每当你调用str.hashCode()java时,使用这里描述的公式计算它.
Java String.hashcode()完全独立于Locale吗?换句话说,如果有人摆弄默认值Locale,我们是否100%确定这不会影响哈希码?
我们知道这种小小的影响toUpperCase()和toLowerCase().
为什么hashcode值相同?
public static void main(String args[])
{
String s1="abc";
String s2=new String("abc");
System.out.println("Hashcode s1-:"+ s1.hashCode());
System.out.println("Hashcode s2-:"+ s2.hashCode());
if(s1==s2){
System.out.println("==true:");
}
}
Run Code Online (Sandbox Code Playgroud)
产量
Hashcode s1-:96354
Hashcode s2-:96354
Run Code Online (Sandbox Code Playgroud)