国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

C#實(shí)現(xiàn)像Git那樣計算Hash值

2019-11-17 03:25:56
字體:
供稿:網(wǎng)友

Git Tip of the Week: Objects一文中得知,Git是這樣計算提交內(nèi)容的Hash值的:

  • Hash算法用的是SHA1
  • 計算前,會在內(nèi)容前面添加"blob 內(nèi)容長度/0",/0表示的是空字符(NUL)。
  • 計算出來的Hash值是40位16進(jìn)制序列(40-character hexadecimal sequence)。

比如提交一個空文件,Git計算出來的Hash值是e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,實(shí)際計算的內(nèi)容是"blob 0/0"。

在Mac的Terminal中輸入命令:echo -en "blob 0/0" | shasum,計算出來也是同樣的Hash值。

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

  • SHA1 Hash算法——C#中對應(yīng)的實(shí)現(xiàn)是SHA1Managed。
  • 和Git一樣在內(nèi)容前面添加字符串——string.Format("blob {0}/0{1}", Content.Length, Content);
  • 生成40位16進(jìn)制的Hash值——ToString("x2")。

具體實(shí)現(xiàn)代碼如下:

復(fù)制代碼
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();    }}
復(fù)制代碼

測試代碼如下:

復(fù)制代碼
public class AutosaveTest{    [Fact]    public void GenerateHash_Test()    {        var autosave = new Autosave();        autosave.Content = "";        autosave.GenerateHash();        Assert.Equal("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", autosave.Hash);    }}
復(fù)制代碼

測試結(jié)果:

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

搞定!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邹城市| 嵩明县| 白水县| 黄梅县| 静宁县| 淮安市| 新乡市| 法库县| 闵行区| 东至县| 高青县| 宿迁市| 云南省| 卫辉市| 诸暨市| 静海县| 瓮安县| 平乡县| 嵩明县| 昭苏县| 金溪县| 名山县| SHOW| 凌云县| 云龙县| 大埔县| 德格县| 宽甸| 舟山市| 普陀区| 湾仔区| 疏附县| 堆龙德庆县| 信宜市| 烟台市| 湘乡市| 舒兰市| 清苑县| 精河县| 汕尾市| 文安县|