用C#中的SHA1algorithm散列
我想使用SHA1Managed
使用SHA1
algorithm散列给定的byte[]
数组。
byte[]
散列将来自unit testing。
预期的散列是0d71ee4472658cd5874c5578410a9d8611fc9aef
(区分大小写)。
我怎样才能做到这一点?
public string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { } }
对于那些想要散列的“标准”文本格式的人,可以使用如下所示的内容:
static string Hash(string input) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); var sb = new StringBuilder(hash.Length * 2); foreach (byte b in hash) { // can be "x2" if you want lowercase sb.Append(b.ToString("X2")); } return sb.ToString(); } }
这将产生一个像0C2E99D0949684278C30B9369B82638E1CEAD415
的散列。
或者代码高尔夫版本:
static string Hash(string input) { var hash = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(input)); return string.Join("", hash.Select(b => b.ToString("x2")).ToArray()); }
public string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(temp); return Convert.ToBase64String(hash); } }
编辑:
将字节数组转换为string时,还可以指定编码,如下所示:
return System.Text.Encoding.UTF8.GetString(hash);
要么
return System.Text.Encoding.Unicode.GetString(hash);
这是我一起去的。 对于那些想要优化的人,请查看https://stackoverflow.com/a/624379/991863 。
public static string Hash(string stringToHash) { using (var sha1 = new SHA1Managed()) { return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash))); } }
您可以使用ComputeHash
“计算指定的字节数组的值”:
var hash = sha1.ComputeHash(temp);
如果要分析string表示forms的结果,则需要使用{0:X2}
格式说明符来格式化字节。
我会在这里扔我的帽子:
(作为静态类的一部分,因为这个片段是两个扩展)
//hex encoding of the hash, in uppercase. public static string Sha1Hash (this string str) { byte[] data = UTF8Encoding.UTF8.GetBytes (str); data = data.Sha1Hash (); return BitConverter.ToString (data).Replace ("-", ""); } // Do the actual hashing public static byte[] Sha1Hash (this byte[] data) { using (SHA1Managed sha1 = new SHA1Managed ()) { return sha1.ComputeHash (data); }
最快的方法是这样的:
public static string GetHash(string input) { return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray()); }
对于小字符输出,使用x2
来代替X2