第一步:先把原始信息转换成二进制编码
比如 abc 转换成
01100001 01100010 01100011
第二步:补位,直到数据长度是 512 的倍数
先在数据后面补一个 1, 然后补 n 个 0, 直到数据长度 x 达到 x % 512 = 448
然后再在后面补充 64 位用来代表输入数据的长度(448 + 64 = 512)。最终,x 的长度达到 512 的倍数。
问题:为什么要补 1 再补 0 ?
这样就可以快速定位输入的结束位置(过滤掉最后 64 位(过滤掉数据长度),然后从后往前开始找,直到找到第一个 1, 再往前的数据均是输入)
第三步:运算
运算初始常量分为两类:
第一类是 h0-h7,分别是自然数中前 8 个质数的平方根的小数部分取前 32 bit 组成。
第二类是 64 个常量, 分别是自然数中前 64 个质数的立方根的小数部分取前 32 bit 组成。
基于两类常量和输入, 开始进行各种位运算, 每次运算后修改 h0 和 h7 的值, 最终值就是 h0~h7 的结果
具体可以参考: