首页 > 其他 > 详细

C#实现像Git那样计算Hash值

时间:2014-03-12 20:28:00      阅读:504      评论:0      收藏:0      [点我收藏+]

Git Tip of the Week: Objects一文中得知,Git是这样计算提交内容的Hash值的:

  • Hash算法用的是SHA1
  • 计算前,会在内容前面添加"blob 内容长度\0",\0表示的是空字符(NUL)。
  • 计算出来的Hash值是40位16进制序列(40-character hexadecimal sequence)。

比如提交一个空文件,Git计算出来的Hash值是e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,实际计算的内容是"blob 0\0"。

在Mac的Terminal中输入命令:echo -en "blob 0\0" | shasum,计算出来也是同样的Hash值。

那在C#中如何以同样的方法计算Hash值呢?

  • SHA1 Hash算法——C#中对应的实现是SHA1Managed。
  • 和Git一样在内容前面添加字符串——string.Format("blob {0}\0{1}", Content.Length, Content);
  • 生成40位16进制的Hash值——ToString("x2")。

具体实现代码如下:

bubuko.com,布布扣
public class Autosave
{
    public string Content { get; set; }

    public string Hash { get; set; }

    public void GenerateHash()
    {
        var computedContent = string.Format("blob {0}\0{1}", Content.Length, Content);
        var hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(computedContent));
        var sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("x2"));
        }
        this.Hash = sb.ToString();
    }
}
bubuko.com,布布扣

测试代码如下:

bubuko.com,布布扣
public class AutosaveTest
{
    [Fact]
    public void GenerateHash_Test()
    {
        var autosave = new Autosave();
        autosave.Content = "";
        autosave.GenerateHash();
        Assert.Equal("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", autosave.Hash);
    }
}
bubuko.com,布布扣

测试结果:

bubuko.com,布布扣
1 passed, 0 failed, 0 skipped, took 1.13 seconds (xUnit.net 1.9.2 build 1705).
bubuko.com,布布扣

搞定!

C#实现像Git那样计算Hash值,布布扣,bubuko.com

C#实现像Git那样计算Hash值

原文:http://www.cnblogs.com/dudu/p/csharp-git-hash.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!