java使用md5_Java_MD5的使用「建议收藏」

java使用md5_Java_MD5的使用「建议收藏」在Java中使用MD5摘要还是很方便的,直接上代码。1packagecom.cxc.nothing;23importjava.nio.charset.Charset;4importjava.security.MessageDigest;56publicclassMD5Test{7publicstaticvoidmain(String[]args){89…

大家好,又见面了,我是你们的朋友全栈君。

在Java中使用MD5摘要还是很方便的,直接上代码。

1 packagecom.cxc.nothing;2

3 importjava.nio.charset.Charset;4 importjava.security.MessageDigest;5

6 public classMD5Test {7 public static voidmain(String[] args) {8

9 String text = “MD5Test”;10 try{11 MessageDigest messageDigest = MessageDigest.getInstance(“MD5”);12 byte[] md5Bytes = messageDigest.digest(text.getBytes(Charset.forName(“UTF-8”)));13 for (byteb : md5Bytes) {14 System.out.println(b);15 }16 } catch(Exception e) {17 e.printStackTrace();18 }19

20 }21

22 }

以上代码就可以实现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。

下面附上转化

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

-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–>3B93–>0101 1101–>5D-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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156802.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 地理加权回归的学习(地理加权回归用来量化空间异质性)[通俗易懂]

    地理加权回归的学习(地理加权回归用来量化空间异质性)[通俗易懂]1、地理加权回归解决空间异质性问题白话空间统计二十四:地理加权回归(一)2、Arcgis的GWR操作白话空间统计二十四:地理加权回归(六)ArcGIS的GWR工具参数说明一白话空间统计二十四:地理加权回归(七)ArcGIS的GWR工具扩展参数说明白话空间统计二十四:地理加权回归(八)结果解读(一)白话空间统计二十四:地理加权回归(十)完结篇…

    2022年9月25日
    2
  • Stream和parallelStream

    Stream和parallelStreamStream和parallelStreamParallelStreamstreamparallelstreamstream和parallelStream一.什么是Stream?Stream是在Java8新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。二.和Iterator的区别Iterator做为迭代器,其按照一定的顺序迭代遍历集合中的每一个元素,并且对每个元素进行指定的操作。

    2022年7月19日
    14
  • netron地址_net in

    netron地址_net in结构化查看自己的模型:支持的模型:ONNX,CoreML,Darknet,Keras,MXNet,TensorFlow,TensorFlowLite,TorchScript,Caffe在线netron:https://lutzroeder.github.io/netron/github:https://github.com/lutzroeder/Netron

    2022年10月19日
    0
  • python实现矩阵转置的几种方法

    python实现矩阵转置的几种方法文章目录(1)方法一、使用numpy转置(2)方法二、使用zip()函数(3)方法三、使用python列表表达式【不占用额外空间,“原地修改”】(4)方法四、新建列表B,使用双重循环添加元素(1)方法一、使用numpy转置importnumpyasnpA=np.mat([[1,2,3],[4,5,6],[7,8,9]])print(A.T)print(A.swapaxes(0,1))#均输出#[[147]#[258]#[369]]importnum

    2022年6月2日
    51
  • 通过select 和状态EINPROGRESS 实现socket 连接超时判断

    通过select 和状态EINPROGRESS 实现socket 连接超时判断调用connect连接一般的超时时间是75s,但是在程序中我们一般不希望等这么长时间采取采取动作。可以在调用connect之前设置套接字非阻塞,然后调用connect,此时connect会立刻返回,如果连接成功则直接返回0(成功),如果没有连接成功,也会立即返回并且会设置errno为EINPROCESS,这并不是一个致命错误,仅仅是告知你已经在连接了,你只要判断是它就继续执行后面的逻辑就行

    2022年7月17日
    17
  • SiamFC 学习(论文、总结与分析)

    SiamFC 学习(论文、总结与分析)文章目录前言一、SiamFC论文学习1.介绍2.深度相似学习在跟踪中的应用2.1全卷积孪生结构3.引入库二、使用步骤1.引入库2.读入数据总结前言之前看了关于siamFC的论文、博客和代码,已经跑通了代码,但是,只是大概初步学习,没有认真的研究细节。为了后面更好的学习Siam系列的算法还是要重新认真的学习SiamFC。先附上论文和代码。论文:Fully-ConvolutionalSiameseNetworksforObjectTracking代码:基于pytorch框架的htt

    2022年10月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号