代码之家  ›  专栏  ›  技术社区  ›  Jimm Chen

Python `pip install`缓存文件的ID字符串是如何计算的?

pip
  •  1
  • Jimm Chen  · 技术社区  · 11 月前

    当我使用 pip install pillow==10.2.0 要在我的机器上安装Pillow,服务器的原始文件名是 pillow-10.2.0-cp312-cp312-win_amd64.whl .

    enter image description here

    下载后,它被缓存在我的本地磁盘中:

    C: \用户\chj\AppData\Local \pip \cache \http-v2\5\d\a\8\5da855ed79847734593562113083d79c2634b1696f0d635c02984eb4.body

    enter image description here

    我想知道,这个ID字符串(作为缓存文件名)是什么 5da855ed79847734593562113083d79c2634b1696f0d635c02984eb4 计算?

    它不是.body文件的SHA224或SHA256。

    sha224(5da855ed79847734593562113083d79c2634b1696f0d635c02984eb4.车身)=98ded132d9782d07fd42cf70d1734984f8bfd5c60c6018903053d68

    sha256(5da855ed79847734593562113083d79c2634b1696f0d635c02984eb4.车身)=154e939c5f0053a383de4fd3da48d9427a7e985f58af8e94d0b3c9fcf4f9

    那是什么?

    1 回复  |  直到 11 月前
        1
  •  3
  •   Allan Wind    11 月前

    ID字符串是url的sha224哈希值(十六进制):

    $ echo -n 'https://files.pythonhosted.org/packages/51/07/7e9266a59bb267b56c1f432f6416653b9a78dda771c57740d064a8aa2a44/pillow-10.2.0-cp312-cp312-win_amd64.whl' | openssl sha224 -hex
    SHA2-224(stdin)= 5da855ed79847734593562113083d79c2634b1696f0d635c02984eb4
    

    你没有指定你正在查看的pip版本,所以我查看了最新版本 https://github.com/pypa/pip 并搜索了'.body',找到了两个参考文献。最有希望的是file_cache.py:

        def get_body(self, key: str) -> IO[bytes] | None:
            name = self._fn(key) + ".body"
            try:
                return open(name, "rb")
            except FileNotFoundError:
                return None
    

    然后你就跟着走 _fn() encode() 最后是电话 get_body(cache_url) :

        def encode(x: str) -> str:
            return hashlib.sha224(x.encode()).hexdigest()
    
        def _fn(self, name: str) -> str:
            # NOTE: This method should not change as some may depend on it.
            #       See: https://github.com/ionrock/cachecontrol/issues/63
            hashed = self.encode(name)
            parts = list(hashed[:5]) + [hashed]
            return os.path.join(self.directory, *parts)
    
                body_file = self.cache.get_body(cache_url)