GetHashCode () sur le tableau d’octets

Qu’est-ce que GetHashCode() calcule lorsqu’il est appelé sur le tableau byte[] ? Les 2 tableaux de données avec un contenu égal ne fournissent pas le même hachage.

Comme d’autres types intégrés non primitifs, il renvoie simplement quelque chose d’arbitraire. Il n’essaie certainement pas de hacher le contenu du tableau. Voir cette réponse.

Les tableaux dans .NET ne remplacent pas Equals ou GetHashCode , donc la valeur que vous obtiendrez est basée sur une égalité de référence (c’est-à-dire l’implémentation par défaut dans Object ). d’un tiers). Vous pouvez vouloir implémenter IEqualityComparer si vous essayez d’utiliser des tableaux d’octets comme clés dans un dictionnaire, etc.

EDIT: Voici un comparateur d’égalité de tableau réutilisable qui devrait convenir tant que l’élément de tableau gère l’égalité de manière appropriée. Notez que vous ne devez pas muter le tableau après l’avoir utilisé comme clé dans un dictionnaire, sinon vous ne pourrez pas le retrouver – même avec la même référence.

 using System; using System.Collections.Generic; public sealed class ArrayEqualityComparer : IEqualityComparer { // You could make this a per-instance field with a constructor parameter private static readonly EqualityComparer elementComparer = EqualityComparer.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(); 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)); } } 

byte[] hérite de GetHashCode() de l’ object , il ne le remplace pas. Donc, ce que vous obtenez est essentiellement l’implémentation de l’ object .

Si ce n’est pas la même instance, il renverra des hachages différents. Je suppose que c’est basé sur l’adresse mémoire où il est stocké en quelque sorte.