在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的使用的更多相关文章

随机推荐

  1. a + b ——C语言初学者百题大战之四

    #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf(" ...

  2. iOS中设置backBarButtonItem的title和action

    一. 设置title 在需要显示该返回键的前一个Controller中设置: 1: navigationItem.backBarButtonItem = UIBarButtonItem(title: ...

  3. Ubuntu 16.04通过源码安装QUEM虚拟机

    下载编译安装: wget http://download.qemu-project.org/qemu-2.9.0.tar.xz tar xvJf qemu-2.9.0.tar.xz cd qemu-2 ...

  4. 求同余方程x^A=B(mod m)的解个数(原根与指标)

    求方程:的解个数 分析:设,那么上述方程解的个数就与同余方程组:的解等价. 设同于方程的解分别是:,那么原方程的解的个数就是 所以现在的关键问题是求方程:的解个数. 这个方程我们需要分3类讨论: 第一 ...

  5. 在WinRT程序中使用MEF

    今天试了一下在WinRT中使用MEF,这里简单的介绍一下步骤. 首先,使用NuGet安装MEF 然后,就可以使用MEF组装插件了,简单的示例如下: interface ILogger    {     ...

  6. Python图像处理(16):图像金字塔

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩.一幅图像的金字塔是一系列以金字塔形 ...

  7. php漏洞挖掘书籍

    PHP是一种被广泛使用的脚本语言,尤其适合web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界超过34%的网站有php的应用,包括Yahoo.sina.163.sohu等大型门户网站.而且很 ...

  8. List<实体>与List<String>数据互转

    1.List<实体>数据: public List<Device> queryOSDevice(String cpu,String ip,String name){ Strin ...

  9. 1-N中1出现的次数

    /*标记1-N中1出现的次数.例如,当N等于18时,1出现的次数为2 + 9 = 11 个位数出现1的为:1,11,十位数出现1的为10-18*/public class OneNoInN { // ...

  10. RocketMQ之broker读取本地文件数据

    这个load操作发生在启动broker的时候. 所以我们直接进入DefaultMessageStore的load()方法: /** * 加载数据 * * @throws IOException */ ...