Hachage avec algorithme SHA1 en C #

Je veux hacher le tableau d’ byte[] à l’aide de l’algorithme SHA1 avec l’utilisation de SHA1Managed .
Le hash byte[] proviendra du test unitaire.
Le hachage attendu est 0d71ee4472658cd5874c5578410a9d8611fc9aef (sensible à la casse).

Comment puis-je atteindre cet objective?

 public ssortingng Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { } } 

Pour ceux qui veulent un formatage “standard” du hachage, vous pouvez utiliser quelque chose comme ceci:

 static ssortingng Hash(ssortingng input) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); var sb = new SsortingngBuilder(hash.Length * 2); foreach (byte b in hash) { // can be "x2" if you want lowercase sb.Append(b.ToSsortingng("X2")); } return sb.ToSsortingng(); } } 

Cela produira un hash comme 0C2E99D0949684278C30B9369B82638E1CEAD415 .

Ou pour une version à code golf:

 static ssortingng Hash(ssortingng input) { var hash = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(input)); return ssortingng.Join("", hash.Select(b => b.ToSsortingng("x2")).ToArray()); } 
 public ssortingng Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(temp); return Convert.ToBase64Ssortingng(hash); } } 

MODIFIER:

Vous pouvez également spécifier l’encodage lors de la conversion du tableau d’octets en chaîne de la manière suivante:

 return System.Text.Encoding.UTF8.GetSsortingng(hash); 

ou

 return System.Text.Encoding.Unicode.GetSsortingng(hash); 

C’est ce que j’ai fait avec. Pour ceux d’entre vous qui souhaitent optimiser, consultez https://stackoverflow.com/a/624379/991863 .

  public static ssortingng Hash(ssortingng ssortingngToHash) { using (var sha1 = new SHA1Managed()) { return BitConverter.ToSsortingng(sha1.ComputeHash(Encoding.UTF8.GetBytes(ssortingngToHash))); } } 

Vous pouvez “calculer la valeur du tableau d’octets spécifié” à l’aide de ComputeHash :

 var hash = sha1.ComputeHash(temp); 

Si vous souhaitez parsingr le résultat en représentation sous forme de chaîne, vous devrez formater les octets à l’aide du spécificateur de format {0:X2} .

Le moyen le plus rapide est le suivant:

  public static ssortingng GetHash(ssortingng input) { return ssortingng.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToSsortingng("X2")).ToArray()); } 

Pour les petits caractères, utilisez x2 en remplacement de X2

Je jette mon chapeau ici:

(dans le cadre d’une classe statique, cet extrait étant constitué de deux extensions)

 //hex encoding of the hash, in uppercase. public static ssortingng Sha1Hash (this ssortingng str) { byte[] data = UTF8Encoding.UTF8.GetBytes (str); data = data.Sha1Hash (); return BitConverter.ToSsortingng (data).Replace ("-", ""); } // Do the actual hashing public static byte[] Sha1Hash (this byte[] data) { using (SHA1Managed sha1 = new SHA1Managed ()) { return sha1.ComputeHash (data); }