stackoverflow sha256cryptoserviceprovider generar example c# hash

c# - sha256cryptoserviceprovider - GetHashCode() en byte[] array



sha256 c# stackoverflow (4)

Al igual que otros tipos incorporados no primitivos, simplemente devuelve algo arbitrario. Definitivamente no intenta mezclar el contenido de la matriz. Vea esta respuesta.

¿Qué calcula GetHashCode() cuando se invoca en la matriz byte[] ? Las 2 matrices de datos con el mismo contenido no proporcionan el mismo hash.


Las matrices en .NET no anulan Equals o GetHashCode , por lo que el valor que obtendrás se basará básicamente en la igualdad de referencia (es decir, la implementación predeterminada en Object ); para la igualdad de valores necesitarás rodar tu propio código (o encontrar algunos de un tercero). Es posible que desee implementar IEqualityComparer<byte[]> si está intentando utilizar matrices de bytes como claves en un diccionario, etc.

EDITAR: Aquí hay un comparador de igualdad de matriz reutilizable que debería estar bien siempre que el elemento de matriz maneje la igualdad de manera apropiada. Tenga en cuenta que no debe mutar la matriz después de usarla como clave en un diccionario, de lo contrario no podrá encontrarla nuevamente, incluso con la misma referencia.

using System; using System.Collections.Generic; public sealed class ArrayEqualityComparer<T> : IEqualityComparer<T[]> { // You could make this a per-instance field with a constructor parameter private static readonly EqualityComparer<T> elementComparer = EqualityComparer<T>.Default; public bool Equals(T[] first, T[] second) { if (first == second) { return true; } if (first == null || second == null) { return false; } if (first.Length != second.Length) { return false; } for (int i = 0; i < first.Length; i++) { if (!elementComparer.Equals(first[i], second[i])) { return false; } } return true; } public int GetHashCode(T[] array) { unchecked { if (array == null) { return 0; } int hash = 17; foreach (T element in array) { hash = hash * 31 + elementComparer.GetHashCode(element); } return hash; } } } class Test { static void Main() { byte[] x = { 1, 2, 3 }; byte[] y = { 1, 2, 3 }; byte[] z = { 4, 5, 6 }; var comparer = new ArrayEqualityComparer<byte>(); Console.WriteLine(comparer.GetHashCode(x)); Console.WriteLine(comparer.GetHashCode(y)); Console.WriteLine(comparer.GetHashCode(z)); Console.WriteLine(comparer.Equals(x, y)); Console.WriteLine(comparer.Equals(x, z)); } }


Si no es la misma instancia, devolverá hashes diferentes. Supongo que se basa en la dirección de memoria donde está almacenada de alguna manera.


byte[] hereda GetHashCode() del object , no lo anula. Entonces, lo que obtienes es básicamente la implementación del object .