我看到這一段代碼在 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)
,但我們必須這樣做奇怪的事,把這些文字到一些字符串
'byte.ToString(「x2」)'產生所述字節的十六進制表示。如果您不確定表達式是什麼或涉及的類型,那麼當您將鼠標懸停在某些事物上時,Visual Studio通常很適應。是的,這可以簡化 - 'BitConverter.ToString(byte [])。Replace(「 - 」,「」)'更短,但不一定更高效(如果你想使用小寫,你需要一個額外的'ToLower' )。 –
關於'.ToArray''Concat'混合 - ['String.Concat'](https://msdn.microsoft.com/en-us/library/dd991828(v = vs.110).aspx)for'IEnumerable '是在.NET4.0中添加的,因此推測這個代碼要麼比這個更舊,要麼意味着向後兼容舊的.NET版本 – UnholySheep
https://msdn.microsoft.com/en-us/library/y11056e9(v= vs.110).aspx – matt