我正在尝试将Python脚本转换为PHP。但是我无法正确获取格式。
的Python:
print(hashlib.sha1(struct.pack('L', 1)).hexdigest())
输出:
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe
PHP:
echo sha1(pack('L', 1));
输出:
3c585604e87f855973731fea83e21fab9392d2fc
有人可以指出我正确的方向,以两种语言获得相同的输出吗?
答案 0 :(得分:3)
由于不同的整数大小,会出现差异。虽然php(version)版本中的L
使用硬编码的32位整数,但Python默认使用机器整数大小。如果您正在使用64位系统,您会发现其中的差异。 (如问题所示)
您需要使用python中的=
来标准化和的大小:
print(hashlib.sha1(struct.pack('=L', 1)).hexdigest())
输出:
3c585604e87f855973731fea83e21fab9392d2fc
请参阅此文档:
答案 1 :(得分:2)
这似乎是一个32对64位的问题。你在运行64位版本的Python吗?
请注意,根据Python docs,L
是“无符号长”。由于您没有指定byte order, size and alignment字符,因此Python将默认为 native 。在Linux上,这意味着64位上有8个字节,32位上是4个字节。
最好告诉Python使用二进制数据时的意思:
<
适用于小端,标准尺寸或>
适用于big-endian,标准尺寸。这将消除任何差异,具体取决于您正在运行的机器类型。
此示例显示您可能使用64位版本的python,L
== Q
(64位)。
>>> print(hashlib.sha1(struct.pack('<I', 1)).hexdigest())
3c585604e87f855973731fea83e21fab9392d2fc
>>> print(hashlib.sha1(struct.pack('<Q', 1)).hexdigest())
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe