Git SHA-1 雜湊值

admin發表於2018-07-16

在Git應用中,長度為40的數字和字元組成的字串司空見慣。

看如下程式碼例項:

[Shell] 純文字檢視 複製程式碼
$ git log --pretty=oneline

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/000919pu6uhi6d7jib6gey.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

前面長度為40的字串就是sha-1值。

sha-1是一種密碼學的雜湊演算法,此演算法的特點是,如果被加密的內容相同,得出的sha-1值也是相同,如果被加密的值不同,那麼得到的sha-1也絕對不會相同,於是可以利用sha-1值唯一標識指定內容。

多數時候,我們看到的sha-1值並不是40位。

程式碼例項如下:

[Shell] 純文字檢視 複製程式碼
$ git log --oneline

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/001016i6kzjqxonqrxqq14.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

有限的幾位字元完全可以唯一標識指定內容,沒有必要完整給出,如果上述例子中7位不夠,系統會自動增加。

一.是否可能出現重複現象:

兩個不同內容計算出的sha-1值相同,這種現象術語稱之為碰撞。

如何計算碰撞的概率本人確實不會,但是可以肯定的是,概率非常低,可以忽略不計。

2017年穀歌公司曾經成功進行了碰撞實驗,但是由於使用的是PDF檔案,而不是文字檔案,不能說明全部問題。

二.sha-1值計算方式:

計算方式這裡只是簡單介紹一下,更為全面詳實的內容,感興趣的可以自行網上搜尋。

在Git中,物件型別的不同,sha-1值的計算方式也有所不同,以Blob物件為例子,計算公式如下:

(1)."blob"字串。

(2).一個空格。

(3).Blob物件內容的長度。

(4).Null(空位元組)。

(5).Blob物件內容。

如果是commit物件,則將"blob"更換為"commit",以此類推。

使用Ruby程式碼計算方式如下:

# 引入SHA-1庫

[Ruby] 純文字檢視 複製程式碼
require "digest/sha1"

# 要計算的內容

[Ruby] 純文字檢視 複製程式碼
content = "螞蟻部落"

# 上面1-5公式的程式碼形式。

# blob #{content.length}\0構成了檔案頭,然後與內容#{content}拼接起來形成新內容。

[Ruby] 純文字檢視 複製程式碼
input = "blob #{content.length}\0#{content}"

#計算拼接後的新內容的 SHA-1 校驗和。

[Ruby] 純文字檢視 複製程式碼
puts Digest::SHA1.hexdigest(input)

僅以計算Blob物件的sha-1為例子做一下演示,知道大致怎麼回事即可,不必深究。 

相關文章