我看到了这段代码 github
public static string CalculateSignature(string text, string secretKey)
{
using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
{
hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text));
return string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2")).ToArray()); // minimalistic hex-encoding and lower case
}
}
这段代码有什么作用?
string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2"))
据我所知,你无法将字符串传递给tostring()
方法。
为什么需要选择?
代码可以简化吗?为什么再次toarray()
然后又concat
?
特别是我不知道b.ToString("x2")
做了什么。我很惊讶它甚至编译。 https://msdn.microsoft.com/en-us/library/system.object.tostring(v=vs.110).aspx说tostring方法没有参数。
然后为什么我需要那个选择的东西。编码器试图完成的是什么。
所以我们得到了一堆字节数组,然后我们使用computeHash来获取一堆字节数组。然后我们重新编码为字符串。这是基本的想法。
那么为什么将文本转换为字节非常快Encoding.UTF8.GetBytes(text)
然而我们却做了一些奇怪的事情将这些文本转换为字符串
答案 0 :(得分:1)
特别是我不知道b.ToString(“x2”)做了什么。我很惊讶它甚至符合
请参阅https://msdn.microsoft.com/en-us/library/y11056e9(v=vs.110).aspx和https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings。它将一个字节格式化为两个字符的小写十六进制字符串。 0x03 => “03”,0x0A => “0A”。
为什么需要选择?
Select
将一个可枚举转换为另一个。由于哈希是byte[]
IEnumerable<byte>
,所以这会将每个byte
转换为表达式内部评估的值。因此,每个字节成为两个字符的十六进制字符串。
在.NET Framework 1.0 / 1.1中添加了为什么toarray()然后再连续?
String.Concat(string[])
。在.NET Framework 4.0中添加了String.Concat(IEnumerable<string>)
。如果这段代码是针对.NET 3.5编写的,那么它就是“最佳”(没有通过更有效的StringBuilder
方法写入)。
你运过它了吗?它生成一个十六进制字符串,表示密钥下数据的HMAC-SHA-2-512。编码员试图完成什么。
我很惊讶它甚至符合
它只使用C#3.0中的语法(它使用的最新内容是lambda expressions。C#3.0下个月将变为10年。(它随.NET Framework 3.5发布)
代码可以简化吗?
不确定
public static string CalculateSignature(string text, string secretKey)
{
using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
{
byte[] hmac = hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text));
StringBuilder builder = new StringBuilder(hmac.Length * 2);
foreach (byte b in hmac)
{
builder.Append(b.ToString("x2"));
}
return builder.ToString();
}
}
嗯,那性能更好。也许它不是“更简单”,取决于你的定义。