zoukankan      html  css  js  c++  java
  • C#实现像Git那样计算Hash值

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

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

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

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

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

    • SHA1 Hash算法——C#中对应的实现是SHA1Managed。
    • 和Git一样在内容前面添加字符串——string.Format("blob {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}{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).

    搞定!

  • 相关阅读:
    Oracle 数据库 用脚本建表空间
    C++ 类中封装Win32API的回调函数
    在MVC 4 中使用自定义Membership
    机试题目
    sscanf()
    字符串转化为整数
    有序数组中一对数的和为特定数
    把一个数组划分成左边奇数右边偶数
    cocos2dx将背景色改为白色
    字符串单词翻转
  • 原文地址:https://www.cnblogs.com/dudu/p/csharp-git-hash.html
Copyright © 2011-2022 走看看