MD5算法中相同字符串计算后得到相同MD5值的概率试验
程序员文章站
2022-07-14 10:30:27
...
在开展一个项目中,需要用到MD5加密,但是发现这种加密方式可能存在一下问题
str1---->str(MD5)1
str2---->str(MD5)2
正常来说,str(md5)1与str(md5)2是不同的,但由于MD5算法的原因,是有概率存在
str(md5)1=str(md5)2
这种情况的。为了测试一下,我选用随机生成车号的形式做了测试,看看一千多万个数据里有多少重复的。
思路就是
1、我要生成1千多万的车号,这些车号不能有相同的,所以我用了循环
2、我要实现这些车号的MD5转化
3、存到数据库中
4、select count(distinct)一下看数据与加密前的车号数量是否一样。
python3.6写的脚本如下,数据库用的是sqlite3
#-*- coding:utf-8 -*-
import sqlite3
import random,string
#实际上radom这个没有发作用
import hashlib
conn = sqlite3.connect('id2md5test.db')
curs = conn.cursor()
curs.execute('''
create table id2md5(
id VARCHAR2(128),
md5 VARCHAR2(128)
)
''')
#生成约2千万辆车牌号
Q=['A','B','C','D','E','F','1','2','3','4','5','6','7','8','9','0']
for n1 in Q:
for n2 in Q:
for n3 in Q:
for n4 in Q:
for n5 in Q:
for n6 in Q:
number ='陕'+n1+n2+n3+n4+n5+n6
#number是输出的车辆号牌组合情况
# print(number)
m = hashlib.md5()
m.update(number.encode('utf8'))
#m.update(number.encode('utf8'))这句话是将计算出来的number车辆号牌字符串转成md5
md5number=m.hexdigest()
# print(md5number)
#md5number是输出的车辆号牌的md5加密形式
query = "insert into id2md5 values ('%s','%s')"%(number,md5number)
# print(query)
curs.execute(query)
conn.commit()
conn.close()
print('finish')
其结果如下所示
对车辆号牌这个字段(id)进行distinct,数了一下是16777216个号牌
MD5算法中相同字符串计算后得到相同MD5值的概率试验
数了一下count(distinct md5),这个字段中不重复的数字也是16777216个,
MD5算法中相同字符串计算后得到相同MD5值的概率试验
最后我看了一下id的数量,不算重复的,还是16777216个,这就证明id没有重复的,md5和id的数量一致,证明md5中也没有重复的
MD5算法中相同字符串计算后得到相同MD5值的概率试验
结论,我弄了一千六百多万个不同字符串,生成md5的值都是唯一的,看来md5计算重复的概率真的很低了
上一篇: 数据结构与算法-排序(二)
下一篇: js汉字转拼音首字母