JAVA

生成java的碰撞数据比较简单

根据网上资料可知:

at,bU,c6的在java中的hash值是相同的

则可以根据这三个不断做 笛卡尔积

简单明了就是做字符串拼接。

举个例子

把A当做at,bU,c6中的数

拼接成 AAAAAAAA(8个A),即可得到3^8个hash值相同的元素

写成python代码为

import json
arr_src = ['at','bU','c6']
arr_rtn = {}
def combs(n,str):
if n == 1:
for j in arr_src:
arr_rtn[str+j]=0
else:
for j in arr_src:
combs(n-1,str+j)
combs(11,"") #11为深度,也是3的11次方,可修改
data=json.dumps(arr_rtn)
print data #data即为得出的json格式字符串,可存入文件
print len(arr_rtn) #len为元素个数

python:

尝试

生成Python内置函数 hash()的一组 hash值相同的元素,使用  a~z A~Z 0~9 这62个字符做src

第一层 62个元素  hash各不相同

第二层 62^2  失败

第三层 62^3  失败

第四层 62^4  失败

最无语的是做到第五次的时候

对62^5个元素进行hash计算,再求其中hash相同的元素,然而62的5次方达到近十亿的个数,内存爆了,电脑死机。

反复三次,放弃了

错误代码,粗糙至极,简陋无比,亮瞎勿怪

from collections import Counter
def main(indeep):
ifGetHashCollision=0
deep=indeep
print deep
dic={}
base="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
hashs=[] def create(n,str):
if n==1:
for i in base:
#str += i
dic[str+i]=0
else:
for i in base:
create(n-1,str+i) create(deep,"") for i in dic:
hashs.append(hash(i)) print len(dic)
test=Counter(hashs)
for i in test:
if test[i] != 1:
print i
ifGetHashCollision=1 main(5) #该参数为62的次方

python字符串hash随机化:

python字符串每一次hash计算的结果都不同,在12年hash collision出来的时候,即对Python版本做了修复, 2.6.8, 2.7.3, 3.1.5

进行了python 字符串hash随机化,带着种子去hash。

所以即使一次得到了碰撞的元素,下一次也不能用。

原来做了两三个小时的无用功。

所以Python的暂时跳过

php

php的 hash collision是最神奇的,从晚上十点多看到现在还没有参透。

长话短说,先看一下网上的资料再看后面的问题:

http://blog.it2048.cn/article-php-hash/

——————半小时过去了——————

假装你已经看完了

根据推算,元素个数为 2^16即 65536个的时候,以 65536为基数,*2 、*3、*4、*.....、*65536所得到的hash碰撞效果最强,65536个元素全部碰撞,服务器处理的时间最长。

在服务器端搭建了一个测试页面

代码如下:

<?php

$rest = file_get_contents("php://input");
$startTime = microtime(true);
$a=json_decode($rest,true);
#var_dump($a);
$endTime = microtime(true);
echo $endTime - $startTime, ' seconds', "\n";
?>

2^16为基数,size(以下为方便,将2^16 = 65536 写为size)为元素个数的数据以json的格式传入

json_decode的计算时间为3.5秒左右【在这里,值得一提的是,burpsuite的计算时间与页面得出的json_decode处理时间基本相同,感叹burpsuite的精准,我用python没有写出来精准计算服务器处理时间的脚本】

然而!

2^15为基数,即 32768为基数,size为元素个数的数据传入时

服务器处理时间达到了17秒

这就是百思不得其解的地方了,12点的时候试了一下,发现了这神奇的一点。

按理解,因为原本在一个链表中碰撞的元素,变成了在两个链表中碰撞,遍历的长度减少,所以服务器处理时间也应该缩减,但是却变成了4倍。

以下是其他的测试表单

基数   元素个数     处理时间(秒)
2^16   2size     3.66
2^16   size       3.71

2^16   size-1       3.53
2^15    size      17.24
2^15    2size       17.31
2^15    0.5size       3.60
2^14    size       14.07/14.23
2^13    size       9.28
2^12    size       5.94
2^12    0.5size       1.33

PHP 数据产生python版本

#!/usr/bin/python
import time
import json
size=pow(2,16) #基数数值
start=time.time()
end=time.time()
array="{"
count=0
for i in range(0,size*size,size): #根据基数调整end符合元素格式
array += "\""+str(i)+"\":0,"
count += 1
print count #在这里显示元素个数,及时调整
array=array[:(len(array)-1)]
array += "}"
#data=json.dumps(array)
#print data
f=open("phpjsonByPython_16_size-1.txt","w")
f.write(array)
f.close()

根据响应时间对应可知,32768为基数,在元素个数为size(65536)范围内是hash碰撞效果最大的。

但是这不太符合网上给出的php hash算法,或者是我还没明白。

推算了两个小时,还没有想出个为什么。

我的php版本为5.3,下次有时间加上php调试器,再看看php底层hash的代码;或者看看网上给出的,或许一人理解错了导致后面的人都理解错了?或者就是我哪里错了。

PHP 未完待续

java、python与留下迷点的php hash collision的更多相关文章

  1. (八)map,filter,flatMap算子-Java&Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  2. 芒果TV招聘研发工程师(JAVA PYTHON),地点长沙

    长沙芒果TV招聘高级 JAVA Python 工程师,工作地点:湖南广电   有兴趣的邮件0xmalloc@gmail.com; zealotyin@qq.com 公司有一大批从北京上海一线互联网企业 ...

  3. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  4. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  5. paip.获取文件名从路径uapi java python php总结...

    paip.获取文件名从路径uapi java python php总结... =====uapi basename_noext($fname); =============java  自己写.. St ...

  6. paip.日期时间操作以及时间戳uapi php java python 总结

    paip.日期时间操作以及时间戳uapi php java python 总结 ///uapi Date 函数 | Day 函数 | Hour 函数 | Minute 函数 | Month 函数 | ...

  7. paip.文件读写api php java python总结.txt

    paip.文件读写api php java python总结.txt 一.多种方式读文件内容.    1.按字节读取文件内容   以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. ...

  8. Spring MVC 程序首页的设置 - 一号门-程序员的工作,程序员的生活(java,python,delphi实战)

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  9. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

随机推荐

  1. input,select默认颜色修改

    input::-webkit-input-placeholder{color: #7f7f7f;} select{color: #7f7f7f} option{color: #7f7f7f;}

  2. Vue+restfulframework示例

    一.简单回顾vue 前不久我们已经了解了vue前端框架,所以现在强调几点: 修改源: npm config set registry https://registry.npm.taobao.org 创 ...

  3. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  4. cf1140E 回文串+染色方案dp

    有点硬核的dp..要用到一个结论.. /* 把原串拆成奇偶串,再拆成极大连续的-1串:该串两端都是非-1数,中间都是-1,并且下标要么都是偶数,要么都是技术 然后对所有这些串进行dp,dp[i][0] ...

  5. bzoj2973转移矩阵构造法!

    /* 构造单位矩阵(转移矩阵) 给定n*m网格,每个格子独立按照长度不超过6的操作串循环操作 对应的操作有 0-9:拿x个石头到这个格子 nwse:把这个格子的石头推移到相邻格子 d:清空该格石子 开 ...

  6. 在centos6.8上源码安装MySQL

    1.安装环境:软件包:mysql-5.6.31.tar.gz 需求相关选项: 安装基目录basedir:/mydb/mysql31数据存放目录datadir:/mydb/mysql31/data端口号 ...

  7. python调用PHP方法

    PHP代码如下:<?php $method = $argv[1]; $param1 = $argv[2]; $param2 = $argv[3]; if(isset($method) & ...

  8. Moco使用简单指导

    下载地址 需要java运行环境支持.下载jar包:moco-runner-<version>-standalone.jar 配置文件 下面是参考: 配置 Moco的配置文件格式使用的是js ...

  9. 微信JSAPI分享朋友圈调试经验:invalid signature签名错误排查

    .invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapi ...

  10. jquery表单提交的新写法

    $('form').submit()和$("form").submit() 这两种都可以实现form表单的提交 jquery中$('form').submit()和$(" ...