Je veux hacher donné byte[]
tableau avec SHA1
Algorithme avec l'utilisation de SHA1Managed
.
Le byte[]
Le hash viendra du test unitaire.
Le hash attendu est 0d71ee4472658cd5874c5578410a9d8611fc9aef
(sensible aux majuscules et minuscules).
Comment puis-je atteindre cet objectif?
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
}
}
Pour ceux qui veulent une mise en forme de texte "standard" du hachage, vous pouvez utiliser quelque chose comme ce qui suit:
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();
}
}
Cela produira un hash comme 0C2E99D0949684278C30B9369B82638E1CEAD415
.
Ou pour une version avec code golfé:
static string Hash(string input)
{
var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
return string.Concat(hash.Select(b => b.ToString("x2")));
}
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
EDIT:
Vous pouvez également spécifier l'encodage lors de la conversion du tableau d'octets en chaîne comme suit:
return System.Text.Encoding.UTF8.GetString(hash);
ou
return System.Text.Encoding.Unicode.GetString(hash);
C'est ce que je suis allé avec. Pour ceux d'entre vous qui veulent optimiser, consultez https://stackoverflow.com/a/624379/99186 .
public static string Hash(string stringToHash)
{
using (var sha1 = new SHA1Managed())
{
return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
}
}
Vous pouvez "calculer la valeur du tableau d'octets spécifié" en utilisant ComputeHash
:
var hash = sha1.ComputeHash(temp);
Si vous souhaitez analyser le résultat sous forme de chaîne, vous devez formater les octets à l'aide de la commande {0:X2}
spécificateur de format.
Le moyen le plus rapide est le suivant:
public static string GetHash(string input)
{
return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
}
Pour la sortie en petits caractères, utilisez x2
en remplacement de de X2
Je vais jeter mon chapeau ici:
(dans le cadre d'une classe statique, car cet extrait est constitué de deux extensions)
//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);
}