我正在尝试将Python脚本转换为PHP。但是,我在获取正确的格式方面遇到了麻烦。
Python:print(hashlib.sha1(struct.pack('L', 1)).hexdigest())
输出:3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe
PHP: echo sha1(pack('L', 1));
输出:3c585604e87f855973731fea83e21fab9392d2fc
谁能告诉我正确的方向,以获得两种语言相同的输出?
由于整数大小不同而产生差异。php版本的pack()中的L
使用硬编码的32位整数,而Python默认使用机器整数大小。如果你在64位系统上工作,你会注意到其中的区别。(如问题所示)
你需要在python中使用=
来标准化和的对齐:
print(hashlib.sha1(struct.pack('=L', 1)).hexdigest())
输出:3c585604e87f855973731fea83e21fab9392d2fc
请参考本文档:
- Python结构:https://docs.python.org/2/library/struct.html
- PHP包:http://www.php.net/manual/en/function.pack.php
这似乎是32位vs 64位的问题。您正在运行64位版本的Python吗?
请注意,根据Python文档,L
是一个"unsigned long"。由于您没有指定字节顺序、大小和对齐字符,Python将默认使用原生。在Linux上,这意味着64位的是8个字节,32位的是4个字节。
在处理二进制数据时,最好告诉Python你的确切意思:
-
<
用于小端,标准尺寸或 -
>
为大端,标准尺寸。
这将消除任何差异,这取决于您运行在什么类型的机器上。
这个例子表明您可能正在使用64位版本的python,如L
== Q
(64位)。
>>> print(hashlib.sha1(struct.pack('<I', 1)).hexdigest())
3c585604e87f855973731fea83e21fab9392d2fc
>>> print(hashlib.sha1(struct.pack('<Q', 1)).hexdigest())
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe