为什么 Cargo 会为同一个注册表创建多个目录?

Why does Cargo create multiple directories for the same registry?

Cargo 将下载的 crate 的源代码存储在 $HOME/.cargo/registry/src(或适当的 $CARGO_HOME 目录)中。我知道我使用的每个唯一注册表都会创建一个单独的目录,大概是为了防止冲突。

我不明白为什么同一个存储库会创建多个目录:

$ ls -ld ~/.cargo/registry/src/github.com-*
drwxr-xr-x   473 shep  staff  16082 Dec 27  2015 ~/.cargo/registry/src/github.com-0a35038f75765ae4
drwxr-xr-x  1187 shep  staff  40358 Feb  8 19:10 ~/.cargo/registry/src/github.com-1ecc6299db9ec823
drwxr-xr-x   380 shep  staff  12920 Sep 11 12:16 ~/.cargo/registry/src/github.com-88ac128001ac3a9a

据推测,附加到末尾的散列在其中起到了一定的作用。是什么导致 Cargo 创建这些目录之一?它会回到以前的目录并继续使用它吗?

The hash is based on two fields:来源的种类(中央仓库、git引用、本地路径等)和来源的URL.

Cargo 曾经委托 rust-url 为 Url 实施 Hash,但随着时间的推移发生了变化。 Cargo 的实现最后一次更改是在 pull request 2737 in order to fix issue 1710; Cargo 现在散列 URL 字符串,而不是 Url 对象,以便生成不依赖于 rust-url 行为的更稳定的散列。

另外,Cargo uses the now-deprecated SipHasher作为散列函数。因为它已被弃用,Cargo 将来可能会更改为另一个哈希函数(或者 SipHasher 可能会移动到一个板条箱,Cargo 将使用它,谁知道呢)。