首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 依 Git 算法計算 SHA-1 Hash:blob 格式與 40 字元十六進制輸出

     編輯:關於C#

Git Hash 算法規則

Git 計算物件 Hash 時:

  1. 演算法:SHA-1
  2. 輸入格式:"blob {內容長度}\0{內容}"(\0 為 NUL 字元)
  3. 輸出:40 字元小寫十六進制字串

例:空檔案 → "blob 0\0" → e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

C# 實作

using System;
using System.Security.Cryptography;
using System.Text;

public class GitHasher
{
    public string Content { get; set; }
    public string Hash { get; private set; }

    public void GenerateHash()
    {
        // 關鍵:UTF-8 編碼 + blob 格式 + NUL 字元
        var computedContent = string.Format("blob {0}\0{1}", Content.Length, Content);
        var bytes = Encoding.UTF8.GetBytes(computedContent);
        
        using (var sha1 = SHA1.Create()) // .NET Core 建議用 SHA1.Create() 而非 SHA1Managed
        {
            var hashBytes = sha1.ComputeHash(bytes);
            
            // 轉 40 字元小寫十六進制
            var sb = new StringBuilder(hashBytes.Length * 2);
            foreach (var b in hashBytes)
                sb.Append(b.ToString("x2"));
            Hash = sb.ToString();
        }
    }
}

單元測試驗證

[Fact]
public void EmptyContent_ShouldMatchGit()
{
    var hasher = new GitHasher { Content = "" };
    hasher.GenerateHash();
    Assert.Equal("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", hasher.Hash);
}

[Fact]
public void NonEmptyContent_ShouldMatchGit()
{
    var hasher = new GitHasher { Content = "hello world" };
    hasher.GenerateHash();
    // 可用命令驗證:echo -en "blob 11\0hello world" | sha1sum
    Assert.Equal("3b18e512dba79e4c8300dd08aeb37f8e728b8dad", hasher.Hash);
}

關鍵細節提醒

  • 編碼必須為 UTF-8,Git 內部統一使用 UTF-8
  • NUL 字元:C# 字串中用 \0 或 \u0000 表示
  • 長度計算:為字串的字元數(Content.Length),非位元組數
  • SHA1Managed vs SHA1.Create():.NET Framework 用 SHA1Managed,.NET Core / 5+ 建議用 SHA1.Create()(自動選擇平台最佳實作,且支援 FIPS)
  • 大小寫:Git 輸出為小寫,ToString("x2") 保證小寫

應用場景

  • 實作 Git 相容的物件儲存(如自建 Git 伺服器、備份工具)
  • 內容定址儲存系統
  • 檔案去重、完整性校驗

掌握此算法,即可在 C# 中產出與 Git 完全一致的物件 ID,實現與 Git 生態的無縫互通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved