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的使用的更多相关文章
随机推荐
- nginx+php简单配置环境
首先我的需求是: 1. 需要有PHP的服务.web目录存放在各处. 2. 需要有多个端口. 步骤: 1. 安装nginx php,我的系统是mac 所以安装使用brew, 一键完成... 2. 开启p ...
- 在WPF中合并两个ObservableCollection
WPF中的ObservableCollection是一个非常常用的集合对象,我们可以通过将它绑定到ListBox之类的集合控件上时,当集合发生变更时,会同步更新到界面上.但是,有的时候我们需要合并两个 ...
- 关于JS中原型链中的prototype与_proto_的个人理解与详细总结
一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我 ...
- dot language 学习笔记
dot language 学习笔记 UP | HOME dot language 学习笔记 Table of Contents 1 dot 语言简介 2 基本语法 2.1 常用图形 2.2 常用线 ...
- 一起來玩鳥 Starling Framework(6)Juggler、Tween、以及DelayCall
這篇開始來講Starling裡的Animation.Juggle是個簡單的Class,用來控制動畫的進行.他負責管理經由add()加進來的實現IAnimatable介面的物件,然後當Juggler的a ...
- 【AS3 Coder】任务四:噪音的魅力(上)
使用框架:AS3任务描述:使用AS3中BitmapData的noise方法以及perlinNoise方法构建自然景观效果以及其他一些比较cool的效果难度系数:2 本文章源码下载:www.iamsev ...
- Android画图系列(二)——自己定义View绘制基本图形
这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们 ...
- edittext SearchView 失去焦点问题
edittext 默认自己主动获取焦点的 并且会出现小键盘非常烦人 <LinearLayout android:id="@+id/focus" ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)
题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...
- Java8:纠结的默认方法
[编程导论(Java)·4.3Java接口] 在[0.3.1 Java简单介绍]中,有这么一段话:"请注意:Java并不是作为教学语言设计的.世界各地的大学在讲授Java的过程中均遇到一些教 ...