#14315·pip

链接哈希是从查询字符串中解析的,不仅包括 URL 片段

作者: yonnnxr创建于 2026年9月15日更新于 2026年9月15日

LinkHash.find_hash_url_fragment() 会搜索整个 URL,寻找 [#&](algo)=value,因此以哈希算法命名的查询字符串参数会被读取为哈希值:

python
>>> from pip._internal.models.link import Link
>>> Link("https://example.com/pkg.whl?token=x&sha256=" + "a" * 64).has_hash
True

这只会在参数不是第一个时触发:仅有 ?sha256=... 无法匹配,因为分隔符必须是 #&。有两个原因表明这不是意图中的行为:

  1. _clean_link() 会决定两个链接是否等价,它只读取片段(urllib.parse.parse_qs(parsed.fragment))。因此,同一个 URL 会被视为用于锁定的哈希值,以及不具有等价性的哈希值。
  2. 正则表达式的名字是 _hash_url_fragment_renews/11936.bugfix.rst 介绍了引入 [#&] 的更改,并称其为 "修复和改进嵌入 URL 片段中的哈希的解析";test_link_hash_parsing 中的每个案例都使用 #& 选项用于处理片段中以 & 分隔的参数(#subdirectory=setup&sha256=...),而不是查询字符串。