Как построен хеш в файле RECORD пакета wheel? - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно знать, как генерируется файл RECORD в файле пакета .whl.Особенно, как он генерирует свой 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='

примечание: пока я заглянул внутрь https://github.com/pypa/setuptools без всякой удачи ...

1 Ответ

1 голос
/ 29 апреля 2019

Вы должны взглянуть на https://github.com/pypa/pip/blob/c9df690f3b5bb285a855953272e6fe24f69aa08a/src/pip/_internal/wheel.py#L71-L84

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

, что можно сделать в образе manylinux2010 с помощью команды bash:

/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'=')\
 )"
...