欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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值的概率试验

MD5算法中相同字符串计算后得到相同MD5值的概率试验

数了一下count(distinct md5),这个字段中不重复的数字也是16777216个,
MD5算法中相同字符串计算后得到相同MD5值的概率试验

MD5算法中相同字符串计算后得到相同MD5值的概率试验

最后我看了一下id的数量,不算重复的,还是16777216个,这就证明id没有重复的,md5和id的数量一致,证明md5中也没有重复的

MD5算法中相同字符串计算后得到相同MD5值的概率试验
MD5算法中相同字符串计算后得到相同MD5值的概率试验

结论,我弄了一千六百多万个不同字符串,生成md5的值都是唯一的,看来md5计算重复的概率真的很低了