10 hex digit git hash 缩写就够了吗?
Is 10 hex digit git hash abbreviation enough?
需要多少个可能的哈希值才能避免 N
项之间的冲突?如果你还记得 birthday paradox,答案比 N
小得多。
我们反问一下:对于N=16^10
个可能的hash值,对应10个hex digits的缩写git revision codes,有多少个revision的概率修订哈希重合度上升到 50%?直接计算表明,如果你有 1234603 个修订,其中两个具有相同 10-digit 哈希的概率是 50%。
现在,在大型活跃存储库中进行一百万次左右的修订并非闻所未闻。这里有人在您的工作中遇到过 git 哈希冲突吗?从理论上讲,那应该发生。
Git 随着对象数量的增加自动缩放缩写哈希的长度,因此这通常不是问题。此外,如果缩写的散列在正常长度下会产生歧义,Git 将自动产生一个更长的、明确的值。如果您需要特定值,某些命令允许您使用名为 --abbrev
的选项控制缩写的长度,并且 core.abbrev
选项可以覆盖默认值。
但是,这些名称在创建时必须是唯一的,因此如果您正在生成需要使用修订版的工具,它们应该始终对完整的对象 ID 进行操作。另请注意,切换到使用 SHA-256 的工作正在进行中,因此您在编写工具时不应假设特定完整对象 ID 的长度。
如“How much of a Git SHA is generally considered necessary to uniquely identify a change in a given codebase?", you can get the minimum required length with git rev-parse --short
中所述
git rev-parse --short=4
但是如果你想确定,并且只使用完整的长度:
使用 Git 2.31(2021 年第一季度),可以将配置变量 'core.abbrev' 设置为 'no' 以强制不使用缩写,而不管哈希算法如何。
这在 时很重要。
参见 commit a9ecaa0 (01 Sep 2020) by Eric Wong (ele828
)。
(由 Junio C Hamano -- gitster
-- in commit 6dbbae1 合并,2021 年 1 月 15 日)
core.abbrev=no
: disables abbreviations
Signed-off-by: Eric Wong
This allows users to write hash-agnostic scripts and configs by disabling abbreviations.
Using "-c core.abbrev=40
" will be insufficient with SHA-256, and "-c core.abbrev=64
" won't work with SHA-1 repos today.
[jc: tweaked implementation, added doc and a test]
git config
现在包含在其 man page 中:
If set to "no", no abbreviation is made and the object names
are shown in their full length.
需要多少个可能的哈希值才能避免 N
项之间的冲突?如果你还记得 birthday paradox,答案比 N
小得多。
我们反问一下:对于N=16^10
个可能的hash值,对应10个hex digits的缩写git revision codes,有多少个revision的概率修订哈希重合度上升到 50%?直接计算表明,如果你有 1234603 个修订,其中两个具有相同 10-digit 哈希的概率是 50%。
现在,在大型活跃存储库中进行一百万次左右的修订并非闻所未闻。这里有人在您的工作中遇到过 git 哈希冲突吗?从理论上讲,那应该发生。
Git 随着对象数量的增加自动缩放缩写哈希的长度,因此这通常不是问题。此外,如果缩写的散列在正常长度下会产生歧义,Git 将自动产生一个更长的、明确的值。如果您需要特定值,某些命令允许您使用名为 --abbrev
的选项控制缩写的长度,并且 core.abbrev
选项可以覆盖默认值。
但是,这些名称在创建时必须是唯一的,因此如果您正在生成需要使用修订版的工具,它们应该始终对完整的对象 ID 进行操作。另请注意,切换到使用 SHA-256 的工作正在进行中,因此您在编写工具时不应假设特定完整对象 ID 的长度。
如“How much of a Git SHA is generally considered necessary to uniquely identify a change in a given codebase?", you can get the minimum required length with git rev-parse --short
git rev-parse --short=4
但是如果你想确定,并且只使用完整的长度:
使用 Git 2.31(2021 年第一季度),可以将配置变量 'core.abbrev' 设置为 'no' 以强制不使用缩写,而不管哈希算法如何。
这在
参见 commit a9ecaa0 (01 Sep 2020) by Eric Wong (ele828
)。
(由 Junio C Hamano -- gitster
-- in commit 6dbbae1 合并,2021 年 1 月 15 日)
core.abbrev=no
: disables abbreviationsSigned-off-by: Eric Wong
This allows users to write hash-agnostic scripts and configs by disabling abbreviations.
Using "
-c core.abbrev=40
" will be insufficient with SHA-256, and "-c core.abbrev=64
" won't work with SHA-1 repos today.[jc: tweaked implementation, added doc and a test]
git config
现在包含在其 man page 中:
If set to "no", no abbreviation is made and the object names are shown in their full length.