用整型来保存MD5

用整型来保存MD5

游戏|数码彩彩2024-05-04 7:39:08502A+A-

基础

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写的,也可以直接获取使用。

点击这里复制本文地址 版权声明:本文内容由网友提供,该文观点仅代表作者本人。本站(https://www.angyang.net.cn)仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

昂扬百科 © All Rights Reserved.  渝ICP备2023000803号-3网赚杂谈