Quiero hash dada una byte[]
matriz usando SHA1
Algoritmo con el uso de SHA1Managed
.
El byte[]
hash vendrá de la prueba unitaria.
El hash esperado es 0d71ee4472658cd5874c5578410a9d8611fc9aef
(distingue entre mayúsculas y minúsculas).
¿Cómo puedo conseguir esto?
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
}
}
hex(e) == hex(E)
Respuestas:
Para aquellos que desean un formato de texto "estándar" del hash, pueden usar algo como lo siguiente:
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(); } }
Esto producirá un hash como
0C2E99D0949684278C30B9369B82638E1CEAD415
.O para una versión con código de golf:
static string Hash(string input) { var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input)); return string.Concat(hash.Select(b => b.ToString("x2"))); }
fuente
IDisposable
, pero un viaje rápido a la fuente de referencia muestra que no sucede nada interesante en.Dispose()
x2
significa minúscula,X2
es mayúsculapublic string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(temp); return Convert.ToBase64String(hash); } }
EDITAR:
También puede especificar la codificación al convertir la matriz de bytes en una cadena de la siguiente manera:
return System.Text.Encoding.UTF8.GetString(hash);
o
return System.Text.Encoding.Unicode.GetString(hash);
fuente
0d71ee4472658cd5874c5578410a9d8611fc9aef
como salida?Esto es con lo que fui. Para aquellos de ustedes que quieran optimizar, consulte 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))); } }
fuente
La forma más rápida es esta:
public static string GetHash(string input) { return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray()); }
Para salida de caracteres pequeños, utilice
x2
en reemplazo deX2
fuente
Puede "calcular el valor de la matriz de bytes especificada" mediante
ComputeHash
:var hash = sha1.ComputeHash(temp);
Si desea analizar el resultado en una representación de cadena, deberá formatear los bytes utilizando el
{0:X2}
especificador de formato.fuente
Arrojaré mi sombrero aquí:
(como parte de una clase estática, ya que este fragmento son dos extensiones)
//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); }
fuente