import hashlib

"""
# MD5算法
## 1.处理明文。
将原文bit长度对512求余；若不等于448，则需要填充原文使得对512求余结果为448.填充方法是第一位填写1，其余位填写0.填充完后长度为512*N+448.

之后将剩余位置512-448=64位，记录原文的真正长度，把长度的二进制值补在最后。这样处理后的信息长度就是 512*（N+）

## 2.设置初始值
MD5的哈希结果长度位128位，按每32位分成一组共4组。

这4组结果是由4个初始值ABCD经过不断演变得到的。

MD5官方实现是这样设置的：
- A = 0x01234567
- B = 0x89ABCDEF
- C = 0xFEDCBA98
- D = 0x76543210

## 第3步循环加工

这一步是最复杂的一步，我们看看下面这张图，此图代表了单次A,B,C,D值演变的流程。


图中，A，B，C，D就是哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环呢？由处理后的原文长度决定。

假设处理后的原文长度是M
主循环次数 = M / 512
每个主循环中包含 512 / 32 * 4 = 64 次 子循环。

上面这张图所表达的就是单次子循环的流程。
"""


m = hashlib.md5()
m.update(b"Nobody inspects")
m.update(b" the spammish repetition")
a = m.digest()
b = m.hexdigest()
print(a)
print(b)

