我需要知道.whl软件包文件中的RECORD文件是如何生成的。特别是它如何为每个文件生成sha256 ...
例如,我们可以看到以下行:
$ cat RECORD | grep WHEEL
pkv-X.Y.Z.dist-info/WHEEL,sha256=X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A,104
似乎来自:
$ sha256sum <WHEEL | awk '{print $1}' | xxd -r -p | base64 | tr +/ -_ | cut -c -43
X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A
$ wc -c <WHEEL
104
但是我想知道它是如何在python中构建的,因为我对tr
和cut -c -43
转换不太信任。
注意:在其他文件上,“似乎” tr
是正确的,即/
-> _
和+
-> -
,但我想使用负责此操作的python源代码...
到目前为止,在python 3.7中,
python3 -c "import hashlib; import base64; print(base64.b64encode(hashlib.sha256(open('WHEEL', 'rb').read()).digest()))"
b'X8kVdBCq85ICewwfaE6btv5qKsFQfVq8NYJIXUK0i1A='
注意:到目前为止,我{@ 3}}都没碰到运气...
答案 0 :(得分:0)
def rehash(path, blocksize=1 << 20):
# type: (str, int) -> Tuple[str, str]
"""Return (hash, length) for path using hashlib.sha256()"""
h = hashlib.sha256()
length = 0
with open(path, 'rb') as f:
for block in read_chunks(f, size=blocksize):
length += len(block)
h.update(block)
digest = 'sha256=' + urlsafe_b64encode(
h.digest()
).decode('latin1').rstrip('=')
# unicode/str python2 issues
return (digest, str(length)) # type: ignore
这可以使用bash命令在manylinux2010映像中完成:
/opt/_internal/cpython-3.7.3/bin/python3 -c "\
import hashlib;\
import base64;\
print(\
base64.urlsafe_b64encode(\
hashlib.sha256(open('FILE_NAME', 'rb').read()).digest())\
.decode('latin1')\
.rstrip(b'=')\
)"