苑晴 发表于 2023-11-8 20:49:34

记一次关于hash.update的疑问

记一次关于hash.update的疑问

问题如下:

```python
import hashlib

for i in range(1, 100000000):
    res = hashlib.md5(str(i).encode('utf-8')).hexdigest()

    if res[:6] == '6d0bc1':
      print(i, res)

16217    6d0bc15654f2e248e7994fb0ea37762b
32856905 6d0bc135cd9a566e3795c34875c7014f
55599522 6d0bc1d301e3c1a7c8fbad0f1be343ff
65495741 6d0bc15993065bd3d52ca932ce26fa98
77595085 6d0bc16df28a72b1adc744bc00bd52f0

---------------------------------------------------------------------

import hashlib
md5=hashlib.md5()
admin = '6d0bc1'
for i in range(100000000):
    md5.update(str(i).encode('utf-8'))
    if md5.hexdigest()==admin:
      print (i, md5.hexdigest())

20206666d0bc1153791aa2b4e18b4f344f26ab4
23050046d0bc1ec71a9b814677b85e3ac9c3d40
91626716d0bc11ea877b37d694b38ba8a45b19c
51302775 6d0bc1a762d786e2f6ef20f705109f10
```

上述两个程序看起来功能都一样,但是运行出来的结果却各有千秋,细看发现第二个程序中采用了hash.update函数,而update函数的功能是类似于字符串拼接的功能,示例如下:

```python
for i in range(1, 3):
    md5.update(str(i).encode('utf-8'))
```

而其等价于:

```python
md5.update(str(1).encode('utf-8') + str(2).encode('utf-8'))
```

所以问题在于第一个程序是通过不停地更新变量值然后进行对应字符串匹配输出,而第二个程序会将后一个字符串与前一个字符串拼接后再进行对应字符串匹配输出,所以导致结果不相同。
页: [1]
查看完整版本: 记一次关于hash.update的疑问