如何将SHA256哈希从整数转换为字符串并返回?

时间:2014-03-23 17:26:29

标签: python

我想在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 :(得分:7)

如果您不喜欢字符串表示形式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'

答案 1 :(得分:0)

另一种方法是使用切片

>>> hex(i)[2:-1]
'2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'