如何将SHA256哈希从整数转换为字符串再转换回来?
我想在MySQL中存储非常大量的SHA256位哈希值。我不想把它们存成VARCHAR(64)类型,而是想用BIGINT类型。请问在Python中最有效的转换方法是什么?我想实现的代码示例如下:
>>> import hashlib
>>> s = hashlib.sha256("foo").hexdigest()
>>> s
'2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
>>> i = int(s, 16)
>>> i
19970150736239713706088444570146546354146685096673408908105596072151101138862L
给定一个i,我该如何准确地得到s?我试过:
>>> hex(i)
'0x2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7aeL'
这个方法差不多,但还不是完全一样。谢谢!
补充说明:我想避免像这样转换十六进制字符串,以去掉前面的0x和后面的L:
>>> hex(i)[2:-1]
'2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
另外,如果哈希值有前导零位,我需要填充零,直到长度达到64,比如:
>>> s = "00000000000000003258ec44ea34c98111234904ef7642608922f9b8b296067d"
>>> i = int(s, 16)
>>> i
1234513556969586830351532907052865231487419381722987759229L
>>> h = hex(i)[2:-1]
>>> h
'3258ec44ea34c98111234904ef7642608922f9b8b296067d'
>>> h = "0" * (64 - len(h)) + h
'00000000000000003258ec44ea34c98111234904ef7642608922f9b8b296067d'
我想避免字符串操作。
2 个回答
0
另一种方法是使用切片
>>> hex(i)[2:-1]
'2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
8
如果你不喜欢hex
给你的字符串格式,你可以用字符串格式化来代替:
'{:x}'.format(i)
Out[32]: '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
补充一下:字符串处理还可以让你指定最小宽度和填充值:
'{:0>64x}'.format(i)
Out[54]: '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
s = "00000000000000003258ec44ea34c98111234904ef7642608922f9b8b296067d"
i = int(s,16)
'{:0>64x}'.format(i)
Out[57]: '00000000000000003258ec44ea34c98111234904ef7642608922f9b8b296067d'
或者,如果你愿意,也可以在第一种方法上直接使用zfill
:
'{:x}'.format(i).zfill(64)
Out[67]: '00000000000000003258ec44ea34c98111234904ef7642608922f9b8b296067d'