这可能永远不会发生在现实世界中,并且可能永远不会发生,但让我们考虑一下:假设您有一个git存储库,进行提交,并且变得非常不幸:其中一个blob最终拥有相同的SHA-1另一个已存在于您的存储库中.问题是,Git将如何处理这个?简直失败了?找到一种方法来链接两个blob并根据上下文检查哪一个需要?
更多的是脑筋急转弯而非实际问题,但我发现这个问题很有趣.
如果我在使用git时遇到哈希冲突会发生什么?
例如,我设法提交两个具有相同sha1校验和的文件,git会注意到它还是损坏了其中一个文件?
可以改进git以适应它,或者我是否必须更改为新的哈希算法?
(请不要通过讨论这个问题来转移这个问题 - 谢谢)
为什么Git使用加密哈希函数SHA-1而不是更快的非加密哈希函数?
相关问题:
Stack Overflow问题为什么Git使用SHA-1作为版本号?问为什么Git使用SHA-1而不是序列号进行提交.
Git有一个众所周知的,或者至少是众所周知的空树,其SHA1是:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
Run Code Online (Sandbox Code Playgroud)
(你可以在任何仓库中看到这个,甚至是新创建的仓库,用git cat-file -t和git cat-file -p).
如果您努力工作并且非常小心,您可以使用这个空树来存储没有文件的目录(请参阅如何将空目录添加到git存储库的答案),尽管这不是一个好主意.
它作为一个参数更有用git diff-tree,其中一个示例钩子可以做到.
我想知道的是,
4b825dc642cb6eb9a060e54bf8d69288fbee4904? (创建符号名称的快速而肮脏的方法是将SHA1放入,例如,.git/Nulltree不幸的是,您必须为每个repo执行此操作.似乎更好地将幻数放在脚本中等等.我只是有一般的厌恶到魔术数字.)
我有一个"新鲜的"git-svn repo(11.13 GB),其中有超过100,000个对象.
我已经做好了
git fsck
git gc
Run Code Online (Sandbox Code Playgroud)
在初步结账后的回购.
然后我试着去做
git status
Run Code Online (Sandbox Code Playgroud)
执行git状态所需的时间是2m25.578s和2m53.901s
我通过发出命令测试了git status
time git status
Run Code Online (Sandbox Code Playgroud)
5次,所有时间都在上面列出的两次之间.
我在Mac OS X上执行此操作,本地而非通过VM.
它不应该花这么长时间.
有任何想法吗?救命?
谢谢.
编辑
我有一个同事坐在我旁边,有一个类似的盒子.减少RAM并使用jfs文件系统运行Debian.他的git状态在同一个回购中运行.3(它也是一个git-svn checkout).
另外,我最近在这个文件夹上更改了我的文件权限(到777),它大大缩短了时间(为什么,我没有线索).我现在可以在3到6秒之间完成任务.这是可以控制的,但仍然很痛苦.
Git和GitHub都显示SHAs的短版本 - 只是前7个字符而不是全部40个 - 并且Git和GitHub都支持将这些简短的SHA作为参数.
例如 git show 962a9e8
例如https://github.com/joyent/node/commit/962a9e8
鉴于可能性空间现在降低了几个数量级,"仅" 2.68亿,Git和GitHub如何防止碰撞?他们如何处理它们?
我发现很难围绕Git如何创建完全独特的哈希,即使在前4个字符中也不允许相同的哈希.我只能使用前四个字符在Git Bash中调用提交.是否在算法中明确决定第一个字符是"超" - 唯一且不会与其他类似的哈希冲突,或者算法是否以相同的方式生成哈希的每个部分?
在新系统上,我们需要单向散列来计算来自二进制输入的数字签名(例如,一千字节的文本或更大的文本和二进制文件).需求类似于Scons(构建系统)散列命令行和源文件,以及Git(版本控制系统)如何散列文件以计算存储/同步签名.
回想一下,Scons使用MD5,Git使用SHA-1.
虽然MD5和SHA-1已被"破坏",但Scons和Git都没有专门用于安全性(例如,它不存储密码),因此一般做法仍然认为这些算法可以接受.(当然,由于传统的采用,这部分是合理化的.)
问题:您是否会在新系统中使用SHA256(不是MD5或SHA-1)进行(非加密/安全)单向散列?
关注的是:
我特别感兴趣的是一个与Scons或Git社区一致的答案,"我们会永远保留我们的!" 或者"我们希望尽快转向新哈希!" (我不确定他们的计划是什么?)