首页 > 编程知识 正文

哈希碰撞的解决办法,java哈希值和地址值

时间:2023-05-04 09:18:37 阅读:16187 作者:2843

其原理很简单,利用hashcode实现机制,构建大量产生相同hashcode的密钥,将hashmap定位时间从o(1)降低到0 (n ) ),即使hash表退化为链表) servlet规范中post请求的处理通常采用hashmap,该hashmap存储请求密钥/值对,因此在处理生成相同hashcode的数千个请求参数名称时,hashmap的定位性能会急剧下降,从而导致

由于java利用DJBX33A算法生成混列值,因此容易大量构建具有相同混列码的值。 在这里,我们将讨论如何构建这个值。 常见的是“相等字符串法”和“中间相遇法”,以下引用别人的文字来说明这种“相等字符串法”。

由于DJBX33A系列散列算法满足了有趣的特性,因此如果hash(“string1”)=hash )“string2”,则在同一位置包含这两个子字符串的父字符串的散列结果将发生冲突。 也就是说,hash )“prefix_string1_poong”根据该特性,只要攻击者能够找到最简单的两个冲突字符串,就可以立即重复组合,生成2的n次方个长度为2n的冲突字符串

这个好像很难实现呢。 只需找到具有相同hashcode的字符串,然后按一定的数组组合算法。 假设我们要求的key的长度为10,则2的10次方,即1024个key能够满足我们的要求(拥有相同的hashcode但具有不同的值)。 这个算法怎么写,其实是计算两个字符组合成多少个不同n位长度的字符。 例如,有两个字符a和b,要组合成两位数,有ab、aa、bb和ba数组。 不是很像“找到n元素的全子集”算法吗? 因为写这个算法有点麻烦,所以我想了一会儿,想想看吧:

我们把数字转换成二进制数。 这样,二进制0,1就代表我们的两个字符。 我们只需要用我们的文字替换0,1就可以了。 例如,要组合为4位,有16种组合,可以用二进制数(0000-1111之间的所有二进制数)替换0到15之间的所有15个数字。 我们把这些二进制数中的0和1分别换成a和b,是我们想要的结果。

通过以上方法,可以轻松编写java生成碰撞字符串的方法,而且速度也快,生成15次方字符串所需的时间也为秒,可以满足测试要求。 (

公共静态最终字符串s0=' rq ';

公共静态最终字符串S1=' qp ';

隐私保护mkhashparams {

Long maxVal=(long ) math.pow(2,size );

system.out.println (' size=' maxval ',int val=' maxVal.intValue ) );

stringbuilder sb=new stringbuilder (;

字符串it=null;

字符串bint=null;

字符串更改bint=null;

for(intI=0; i maxVal; I ) {

it=空值;

bint=long.tobinarystring(I;

更改bint=bint.replace ('0',S0 );

更改bint=更改bint.replace ('1',S1 );

it=changedBInt;

int tmpLength=bInt.length (;

if(tmplengthsize ) {

longappendlength=size-tmp length;

it=mkappendedstr(appendlength,it );

}

if(I0 ) {

sb.append (' );

}

sb.append(it;

sb.append('=';

sb.append(mockval );

//system.out.println('it='it ',hash=' it.hashCode ) );

}

String str=sb.toString (;

write(str,' c:/d ',' hash_params.txt ';

返回str;

}

隐私保护策略mkappendedstr

stringbuilder sb=new stringbuilder (;

for(intI=0; i length; I ) {

sb.append(S0;

}

sb.append(it;

return sb.toString (;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。