据我所知,当Git为文件分配SHA1哈希时,该SHA1对于文件的内容是唯一的.
因此,如果文件从一个存储库移动到另一个存储库,则该文件的SHA1保持不变,因为其内容未更改.
Git如何计算SHA1摘要?它是在完整的未压缩文件内容上执行的吗?
我想模仿在Git之外分配SHA1.
存储在树对象git ls-tree中的SHA1哈希值(由返回的sha1sum)与文件内容的SHA1哈希值不匹配(由返回)
$ git cat-file blob 4716ca912495c805b94a88ef6dc3fb4aff46bf3c | sha1sum
de20247992af0f949ae8df4fa9a37e4a03d7063e -
Run Code Online (Sandbox Code Playgroud)
git如何计算文件哈希值?它是否在计算哈希值之前压缩内容?
使用python 2.7,以下代码计算文件内容的mD5 hexdigest.
(编辑:嗯,不是因为答案已经显示,我只是这么认为).
import hashlib
def md5sum(filename):
f = open(filename, mode='rb')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf)
return d.hexdigest()
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用python3运行该代码,则会引发TypeError异常:
d.update(buf)
TypeError: object supporting the buffer API required
Run Code Online (Sandbox Code Playgroud)
我发现我可以使用python2和python3运行代码,将其更改为:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
Run Code Online (Sandbox Code Playgroud)
现在我仍然想知道为什么原始代码停止工作.看来,当使用二进制模式修饰符打开文件时,它返回整数而不是编码为字节的字符串(我说因为type(buf)返回int).这种行为是在某处解释的吗?