工作点滴积累(1)---MD5和编码
今天同事忽然问了一个问题,他发现同一个字符,比如"电影",用项目中的md5工具类生成的hash值和网上提供的在线MD5生成的hash值有时不一样,在只包含了字母字符串中,生成的hanh值都是一样的,我看了一下项目里面的md5工具类,其中有这样一段代码
InputStream fis = new FileInputStream(fileName); byte buffer[] = new byte[1024]; MessageDigest md5 = MessageDigest.getInstance(hashType); for (int numRead = 0; (numRead = fis.read(buffer)) > 0;) { md5.update(buffer, 0, numRead); } fis.close();
从代码可以看出,最后生成的hash值和文件的字节内容有关,这里强调一下"字节",是因为不同的编码方式,最后保存到硬盘的字节内容也就不一样了,我们知道utf-8和gbk的就不一样。
因为在线的MD5我们无法探究它会使用何种方式编码,所以我们只能猜测一种可能的原因就是对字符串的编码格式不一样。
初次之外在网上经常看到大写、小写的MD5,因为经过MD5算法生成的结果中包含了0~1、a~f这16个字符,而这里的大、小写也就是指的a~f还是A~F
例如如下是"电影"字符的hash结果:
3F8D131D1086EF12F2EED2D845D2F7D7
3f8d131d1086ef12f2eed2d845d2f7d7
它俩的区别仅在a~f这几个字符的大小写上面,而且这是一个32位的MD5 hash值,MD5中有16位和32位的区分,如下是"电影"字符16位的hash值:
1086EF12F2EED2D8
1086ef12f2eed2d8
也就是生成的hash值的字符长度为16。
注:以上的MD5计算结果使用的是在线工具http://www.senparc.com/WebTools.xhtml/MD5。