以编程方式轻松更改哈希

小豆蔻

此刻,我经常需要在单元测试中使用哈希和加密签名来做一些事情。有时它们会生成,而我只需要稍作改动并证明某些东西不再起作用。它们是十六进制数字0-9和特定长度的af字符串。这是一个64位的示例:

h = '702b31faad0246cc89a5dc782cdf5235a885d0f529fb30a4e1e70e00938df91a'

我只想在其中某处更改一个字符。

您无法确定每个数字0-9和a-f都在其中,尽管您会猜测至少有95%的数字都在其中。如果可以确定,我会继续h = h.replace('a', 'b', 1)进行下去。

如果您手动进行操作,则只需查看一下即可看到第三位数字为2并运行:

new = list(h)
new[2] = '3'
h = ''.join(new)

但是,如果您看不到它并且需要以编程方式进行操作,那么在某处仅更改其中一个字符的一种干净明确的方法是什么?

沃尔特·特罗斯
from random import randrange
h = '702b31faad0246cc89a5dc782cdf5235a885d0f529fb30a4e1e70e00938df91a'
i = randrange(len(h))
new_h = h[:i] + hex(int(h[i], 16) + randrange(1, 16))[-1:] + h[i+1:]

换句话说:

  • 选择一个随机指数ih
  • 将字符串拆分为索引之前的部分,索引处的char和其余部分
  • 用十六进制值替换索引处的char,其十六进制值在1到15之间以模16的随机整数递增(即,其最右边的十六进制字符)
  • 从以上片段构建新字符串

请注意,以1到15(包括在内)之间的值为增量,后跟以16为模,则永远不会将十六进制数字映射到其自身。以0或16为增量将其完全映射到自身。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章