Java_MD5的使用
在Java中使用MD5摘要还是很方便的,直接上代码。
package com.cxc.nothing; import java.nio.charset.Charset;
import java.security.MessageDigest; public class MD5Test {
public static void main(String[] args) { String text = "MD5Test";
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] md5Bytes = messageDigest.digest(text.getBytes(Charset.forName("UTF-8")));
for (byte b : md5Bytes) {
System.out.println(b);
}
} catch (Exception e) {
e.printStackTrace();
} } }
以上代码就可以实现MD5摘要了。由于摘要的结果是字节数组,并不是我们常见的字符串,所以还有工作要做。
字节数组转字符串,还不简单,直接String str = new String(md5Bytes);结果,打印出来之后,才发现我太天真了。
然后各种百度之后,我终于知道了,原来这里的字节数组不能直接转字符串,而通常的做法是转成十六进制的数字。
MD5摘要的结果是一个128bit的大整数,
因为8bit表示一字节,所以当用字节表示的时候就会是128/8=16个字节。
因为4bit表示一个十六进制,所以当用十六进制表示的时候就会是128/4=32个十六进制数字。
如果你打印上面代码的md5Bytes,你就会看到如下的一个字节数组:
[-83, -42, -124, -31, -122, 59, 93, -112, 5, -125, 35, 104, 37, -92, 49, -62]
这里一共16个字节,而每个字节都需要拆分成两个十六进制数字。
我们先拿59来拆,这里的59是十进制的,把她写成8位的二进制0011 1011,再4位为一组转成十六进制就是3 B,所以这里的59,最后转化完就是3B。
接下来看看5,把她转成8位的二进制0000 0101,再4位为一组转成十六进制就是0 5,所以这里的5,最后转化完就是05,注意是“05”,而不是“5”。
正整数的拆分都同上,接下来就是负整数的拆分了。
接下来我们拆分-83,因为-83是负整数,所以实际存的是他的补码。求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1。
先写出83的二进制表示01010011,然后取反就是10101100,再加1就是10101101,所以-83实际存储的二进制应该是1010 1101,同样4位为一组转成十六进制就是A D。
下面附上转化
-83-->1010 1101-->A D
-42-->1101 0110-->D 6
-124-->1000 0100-->8 4
-31-->1110 0001-->E 1
-122-->1000 0110-->8 6
59-->0011 1011-->3 B
93-->0101 1101-->5 D
-112-->1001 0000-->9 0
5-->0000 0101-->0 5
-125-->1000 0011-->8 3
35-->0010 0011-->2 3
104-->0110 1000-->6 8
37-->0010 0101-->2 5
-92-->1010 0100-->A 4
49-->0011 0001-->3 1
-62-->1100 0010-->C 2
change
所以MD5摘要实际上生成的128bit是(请无视空格):1010 1101 1101 0110 1000 0100 1110 0001 1000 0110 0011 1011 0101 1101 1001 0000 0000 0101 1000 0011 0010 0011 0110 1000 0010 0101 1010 0100 0011 0001 1100 0010
最终转化成32位的十六进制表示就是ADD684E1863B5D900583236825A431C2
以上写的是转化的思路,具体的实现,网上有很多代码,这里就不贴出来了。
在完成这篇文章之前,我参考了如下资料,在此表示感谢:
http://www.cnblogs.com/renchunxiao/p/3411370.html
http://blog.csdn.net/hll174/article/details/51063689
http://blog.csdn.net/jiaomenglei/article/details/52728796
https://wenku.baidu.com/view/3145fb45ad51f01dc281f1c5.html
https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin
Java_MD5的使用的更多相关文章
随机推荐
- 【Treap】BZOJ1588-[HNOI2002]营业额统计
[题目大意][借用别人的概括]给出一个n个数的数列a,对于第i个元素ai定义fi=min(abs(ai-aj)),(1<=j<i),其中f1=a1.输出sum(fi) (1<=i&l ...
- java static代码段
1)java中还有个static代码块的形式,形式为 static {……}.static代码块是类定义的一部分,仅仅在类被初次加载的时候被调用一次,之后再调用不会再加载.那么类什么时候首次被加载呢? ...
- Python学习实践 | speech智能语音模块
最近的生活.学习节奏很是容易被打断,终于,在今天,既实习结束之后,夏令营也结束了. 前几天,一个人在复习地很累的时候,又重新将Python捡了起来,看了挺多的知识点. 真是太有意(wu)思(liao) ...
- 你真的了解try{ return }finally{}中的return?(转载)
发现一篇有意思的博文,分享一下 谁能给我我解释一下这段程序的结果为什么是:2.而不是:3 代码如下: class Test { public int aaa() { int x = 1; try { ...
- flask_admin model官方文档学习
文档地址:http://www.minzhulou.com/docs/flask-admin/api/mod_model.html model在flask_admin算是比较重要的部分,根据文档稍微的 ...
- MySQL对时间的处理总结
1.to_days函数查询今天的数据:select * from 表名 where to_days(时间字段名) = to_days(now()); to_days函数:返回从0000年(公元1年)至 ...
- solr 统计频率(term frequency)
1.统计单词在某个字段出现的频率次数 term frequency实现使用了function query. 例如统计‘公司’这个关键字在text这个字段中出现的次数 在返回的时候进行计算统计,即在返回 ...
- Android App引导页这些坑你自己犯过吗?
场景:測试机:华为荣耀6x 今天我自己掉入一个非常蠢蠢的坑,一个引导页搞了20多分钟.无论我怎么測试用真机还是模拟器都无法执行,可是我写的demo全然没问题,好无语,我都怀疑我是不是搞android, ...
- 向Solr数据集提交Json格式数据(Scala,Post)
import scalaj.http.Http class SolrAdd () {// 方法接受两个参数,dataType为数据集名称,jsonString为数据json字符串 def postTo ...
- android 开发者的个人博客集
1. http://stormzhang.com/posts.html //不少的好的工具与建议