基础1byte = 8bit (1字节等于8比特)
文章插图
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字节,再不断地将两个字节合并成一个字节,最后得到两个大整型的数字 。
详细步骤
- 由于MySQL最大的整数类型为bigint,要考虑到转换后的数字是否会溢出 。将两个字节合并为一个字节的过程是:先将上一步操作得到的结果左移8位,然后将下一个字节左移4位,作为高位,再下一个字节不变,作为低位,三个数相加得到结果,以此循环直到将32字节的MD5遍历结束 。因此最后得到的结果为(32/2)*8=128bit=16byte 。而bigint占用8byte,因此需要用两个bigint来存放 。
- 合并的过程中,单个字符的处理为:将单个字符看成是一个十六进制数,再进行移位和合并 。例如“AE43”用ascii的十进制表示为65,69,52,51 。这里不使用ascii对应的数字进行运算,因为MD5是由数字和字母组成,使用65,69这样大的数字,最后造成溢出 。
图解由于我表达能力有限,可能无法表达出中心思想,最后给大家上一幅稿图,也许思路能更清晰一点 。
文章插图
每两个字符作为高低位合并
如果你有兴趣,可以点击下方的了解更多,可以到我的github查看demo和源码 。当然了,如果你的项目是用golang写的,也可以直接获取使用 。
【用整型来保存MD5】
推荐阅读
- 深入理解Linux IO复用之epoll
- 午后工作易犯困 来点提神茶
- 天美仕用创意承载茶文化之新生
- 使用tcpdump和wireshark分析tcp流
- 电脑族宜多用菊花茶熏眼
- ping命令的用法,收藏起来放着备用
- Nginx配置中一个不起眼字符"/"的巨大作用,失之毫厘谬以千里
- Web 攻击越发复杂,如何保证云上业务高可用性的同时系统不被入侵?| 专家谈
- Windows和Linux通吃,最新远控木马“Dacls”来袭
- 为什么我使用了索引,查询还是慢?