链接哈希是从查询字符串中解析的,不仅包括 URL 片段
作者: yonnnxr创建于 2026年9月15日更新于 2026年9月15日
LinkHash.find_hash_url_fragment() 会搜索整个 URL,寻找 [#&](algo)=value,因此以哈希算法命名的查询字符串参数会被读取为哈希值:
>>> from pip._internal.models.link import Link
>>> Link("https://example.com/pkg.whl?token=x&sha256=" + "a" * 64).has_hash
True这只会在参数不是第一个时触发:仅有 ?sha256=... 无法匹配,因为分隔符必须是 # 或 &。有两个原因表明这不是意图中的行为:
_clean_link()会决定两个链接是否等价,它只读取片段(urllib.parse.parse_qs(parsed.fragment))。因此,同一个 URL 会被视为用于锁定的哈希值,以及不具有等价性的哈希值。- 正则表达式的名字是
_hash_url_fragment_re;news/11936.bugfix.rst介绍了引入[#&]的更改,并称其为 "修复和改进嵌入 URL 片段中的哈希的解析";test_link_hash_parsing中的每个案例都使用#。&选项用于处理片段中以&分隔的参数(#subdirectory=setup&sha256=...),而不是查询字符串。
内容来源: pypa/pip