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

王朝学院·作者佚名  2016-05-06  
宽屏版  字体: 小 | 中 | 大 | 超大  

从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")。

具体实现代码如下:

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();

}

}

测试代码如下:

public class AutosaveTest

{

[Fact]

public void GenerateHash_Test()

{

var autosave = new Autosave();

autosave.Content = "";

autosave.GenerateHash();

Assert.Equal("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", autosave.Hash);

}

}

测试结果:

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

搞定!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有