gpt4 book ai didi

C# 计算 GIT 提交哈希

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:14 25 4
gpt4 key购买 nike

我正在尝试手动获取 GIT 提交的 SHA1 提交哈希,但有些地方工作不正常。

首先我们有看起来像这样的标准提交消息:

tree f594b3f6d9ae291c83902f3992aa36872aa70d68

parent 0000004bf6d464667df5150b4526083886947d92

author User <foo@bar.com> 1390620460.46263 +0000
committer User <foo@bar.com> 1390620460.46263 +0000

Commit Message

我们称之为“commitMessage”

规范说要获取提交哈希,我们必须 sha1:

  • 字符串“commit”
  • 加一个空格“”
  • 加上commitMessage中的字节数
  • 加一个空字节
  • 加上commitMessage

so(伪代码obv)

SHA1( "commit"+ ""+ numBytes(commitMessage) + '\0' + commitMessage );

这是我在 C# 中的实现(我知道这很笨拙)

    var commitBody = "tree " + treeHash + "\n\n" +
"parent " + parentHash + "\n\n" +
"author User <foo@bar.com> " + date + "\n" +
"committer User <foo@bar.com> " + date + "\n\n" +
"My Commit Message\n";

var blob = "commit " + Encoding.UTF8.GetByteCount(commitBody);

// This is the string "commit " (with a space) + byte count
var first = Encoding.UTF8.GetBytes(blob);

// This is just the null byte
var second = new byte[1];
second[0] = (byte)0;

// This is the commitMessage
var third = Encoding.UTF8.GetBytes(commitBody);

// Merge first, second, third into bytez as a byte array
var bytez = new byte[first.Length + second.Length + third.Length];
Buffer.BlockCopy(first, 0, bytez, 0, first.Length);
Buffer.BlockCopy(second, 0, bytez, first.Length, second.Length);
Buffer.BlockCopy(third, 0, bytez, first.Length + second.Length, third.Length);

// Debug Print
Console.WriteLine(Encoding.UTF8.GetString(bytez));

// Compute the hash and print it
var sss = SHA1.Create();
var myssh = GetString(sss.ComputeHash(bytez));
Console.WriteLine(myssh);

返回的散列与 GIT 返回的不同。我实际上并不期望任何人知道如何做到这一点,因为这不是通常要做的事情,但我想我会问。

感谢您的帮助:D

最佳答案

如果您在字符串中使用 UTF-8 字符,请不要使用 string.Length 来保留字节数组。如果字符串只包含 ASCII 字符,这是正确的,但如果字符串中有 UTF-8 字符,则 .Length 将小于实际字节大小。

由于您正在使用 .Length 分配一个数组,该数组可能太小并且可能不会复制所有字符串数据。

我建议您使用 StringBuilder 构建您的字符串,然后使用 System.Text.Encoding.UTF8.GetBytes(stringbuilder.ToString()) 来以字节形式获取数据。

StringBuilder sb = new StringBuilder();
sb.Append("commit "+ Encoding.UTF8.GetByteCount(commitBody));
sb.Append("\0");
sb.Append(commitBody);

var sss = SHA1.Create();
var bytez = Encoding.UTF8.GetBytes(sb.ToString());
var myssh = GetString(sss.ComputeHash(bytez));
Console.WriteLine(myssh);

关于C# 计算 GIT 提交哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com