md5值是如何计算出来的

智数映溟者
• 阅读 783

关于md5生产的写法, 多种多样,今天来看一个比较标准的写法,也即org.springframework.util中DigestUtils里面的写法。
所有的写法都是分两步,第一步是生产摘要的字节数组,固定是16个字节,128位

private static final String MD5_ALGORITHM_NAME = "MD5";

private static final char[] HEX_CHARS =
            {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
   /**
     * Calculate the MD5 digest of the given bytes.
     * @param bytes the bytes to calculate the digest over
     * @return the digest
     */
    public static byte[] md5Digest(byte[] bytes) {
        return digest(MD5_ALGORITHM_NAME, bytes);
    }

    private static byte[] digest(String algorithm, byte[] bytes) {
        return getDigest(algorithm).digest(bytes);
    }

第二步是生成16进制字符

   private static char[] encodeHex(byte[] bytes) {
        char[] chars = new char[32];
        for (int i = 0; i < chars.length; i = i + 2) {
            byte b = bytes[i / 2];
            chars[i] = HEX_CHARS[(b >>> 0x4) & 0xf];
            chars[i + 1] = HEX_CHARS[b & 0xf];
        }
        return chars;
    }

每一个字节会被转化成两个16进制字符,因此最后md5输出的字符串一共是32个字符,而且字符的范围呢, 全在HEX_CHARS中。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
sqlalchemy 各种关系的写法
Intro因为sqlalchemy这玩意儿不是特别常用,偶然提起的时候想写个多对多关系还搜索了半天。于是趁机做个笔记。注意事项ForeignKeydb.ForeginKey的参数是<表名.<键名,而不是<类名.<字段名,务必注意这个区别。back\_populates和ba
Easter79 Easter79
3年前
svg自适应写法
svg自适应写法<pre<!DOCTYPEhtml<htmllang"en"<head<metacharset"UTF8"<titleDocument</title</head<body<divstyle"width:30%;height:3.6rem;"<svg
Stella981 Stella981
3年前
JavaScript中复杂判断的优雅写法
关注 Vue中文社区,回复“加群”加入我们一起学习,天天进步!(https://oscimg.oschina.net/oscnet/6b6d14e678640dbeb46686c81a1fc9ed579.jpg)作者Think.https://juejin.im/post/5bdfef86
Stella981 Stella981
3年前
ES6 系列之 Babel 是如何编译 Class 的(上)
_摘要:_ 前言在了解Babel是如何编译class前,我们先看看ES6的class和ES5的构造函数是如何对应的。毕竟,ES6的class可以看作一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。constructorES6中:\
Stella981 Stella981
3年前
JavaScript获取星期几的几种方法
星期几的4种JS代码写法,有需要的朋友可以参考一下第一种写法 代码如下:varstr"";varweeknewDate().getDay();if(week0){str"今天是星期日";}elseif(week1
Stella981 Stella981
3年前
Python 元组Tuple概念和操作
元组概念:有序的不可变的元素集合和列表的区别就是,元组元素不能修改定义一个元素的写法(666,)t(666,)正确写法t(666)错误写法,括号当成优先级的括号了多个元素
Easter79 Easter79
3年前
SQL Server 2019中Function默认返回值会影响Function创建时规定的返回值类型
项目里客户端突然报错,原因是SQLServer中某个Function返回值有问题,拿来代码看还是比较简单的Function,虽然写法很不好,但是selectdbo.fn_xxxfunction(0)返回值是空就有点奇怪。IFOBJECT_ID('fn_xxxfunction','FN')ISNOTNULLDRO
Stella981 Stella981
3年前
Delphi Sysem.JSON 链式写法(转全能中间件)
 链式写法有很多优点:连贯、语意集中、简洁、一气呵成、可读性强。比如要把3.1415926中的59提取为一个整数:Pi.ToString().Substring(5,2).ToInteger()轻车熟路的感觉,让人觉得,哇!好帅的写法,牛x。   以前以为只有TJSONBuilder才支持链式语法,今天发现TJSONObject也
Stella981 Stella981
3年前
SQL Server 2019中Function默认返回值会影响Function创建时规定的返回值类型
项目里客户端突然报错,原因是SQLServer中某个Function返回值有问题,拿来代码看还是比较简单的Function,虽然写法很不好,但是selectdbo.fn_xxxfunction(0)返回值是空就有点奇怪。IFOBJECT_ID('fn_xxxfunction','FN')ISNOTNULLDRO
卜哥歌 卜哥歌
1年前
[Java的写法]之MD5对字符串签名操作
对字符串签名后,1:长字符串变为32位字符:aacfbe08d042fddd8ee778b148efc9232:只要长字符串内容不变,签名后得到的32位字符不变。适合用来做ID等。privateStringgenKeyId(StringkeyStr)ret