<返回更多

用整型来保存MD5

2020-01-03    
加入收藏

基础

1byte = 8bit (1字节等于8比特)

 

用整型来保存MD5

MySQL数据库整数类型介绍

 

前言

前两天写了一篇文章,是介绍如何将32-byte的MD5转为整型来保存,最后使用了两个ubiging和一个uint来保存,共使用20个字节,有兴趣的可以翻翻我的文章。在评论区里有各路大神提出建议和思路,令我豁然开朗,或许还有更简便的方法,使用更少字节来保存32-byte的MD5。

在这篇文章里我将讲解一下思路,最后可以将32-byte的MD5转为两个ubigint来保存,共16个字节。对文字没有兴趣的同学可以直接看github的demo,点击文章最下方的“了解更多”可跳转到我的github页面,用golang实现的。

 

再识MD5

这里并不打算长篇大论地讨论MD5的由来,只是简单梳理一下。

MD5是一个128bit的大整数,而每8bit为1个字节,每个字节所能表示的最大范围为[0,2^9-1=511]。

这超出了ascii码所能表示的范围,无法将MD5打印出来。因此将每个字节的高低位拆分一个字节,这样每个字节所能表示的最大范围为[0,2^5-1=31]。这样一来,原本16个字节(128/8=16)的MD5就变成了32个字节(128/4=32)。

 

思路

认清了MD5的原貌,再来对他下手吧。

将32字节的MD5拆分为两个16字节,再不断地将两个字节合并成一个字节,最后得到两个大整型的数字。

 

详细步骤

  1. 由于MySQL最大的整数类型为bigint,要考虑到转换后的数字是否会溢出。将两个字节合并为一个字节的过程是:先将上一步操作得到的结果左移8位,然后将下一个字节左移4位,作为高位,再下一个字节不变,作为低位,三个数相加得到结果,以此循环直到将32字节的MD5遍历结束。因此最后得到的结果为(32/2)*8=128bit=16byte。而bigint占用8byte,因此需要用两个bigint来存放。
  2. 合并的过程中,单个字符的处理为:将单个字符看成是一个十六进制数,再进行移位和合并。例如“AE43”用ascii的十进制表示为65,69,52,51。这里不使用ascii对应的数字进行运算,因为MD5是由数字和字母组成,使用65,69这样大的数字,最后造成溢出。

 

图解

由于我表达能力有限,可能无法表达出中心思想,最后给大家上一幅稿图,也许思路能更清晰一点。

 

用整型来保存MD5

每两个字符作为高低位合并

 

如果你有兴趣,可以点击下方的了解更多,可以到我的github查看demo和源码。当然了,如果你的项目是用golang写的,也可以直接获取使用。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>