Disons que j'ai un objet qui stocke un tableau d'octets et que je veux être capable de générer efficacement un code de hachage pour celui-ci. J'ai utilisé les fonctions de hachage cryptographiques pour cela dans le passé parce qu'elles sont faciles à mettre en œuvre, mais elles font beaucoup plus de travail qu'elles ne le devraient pour être cryptographiquement unidirectionnelles, et je ne me soucie pas de cela (j'utilise juste le hashcode comme une clé dans une table de hachage).
Voici ce que j'ai aujourd'hui :
struct SomeData : IEquatable<SomeData>
{
private readonly byte[] data;
public SomeData(byte[] data)
{
if (null == data || data.Length <= 0)
{
throw new ArgumentException("data");
}
this.data = new byte[data.Length];
Array.Copy(data, this.data, data.Length);
}
public override bool Equals(object obj)
{
return obj is SomeData && Equals((SomeData)obj);
}
public bool Equals(SomeData other)
{
if (other.data.Length != data.Length)
{
return false;
}
for (int i = 0; i < data.Length; ++i)
{
if (data[i] != other.data[i])
{
return false;
}
}
return true;
}
public override int GetHashCode()
{
return BitConverter.ToInt32(new MD5CryptoServiceProvider().ComputeHash(data), 0);
}
}
Des idées ?
dp : Vous avez raison de dire que j'ai manqué une vérification dans Equals, je l'ai mise à jour. L'utilisation du hashcode existant du tableau d'octets résultera en une égalité de référence (ou du moins ce même concept traduit en hashcodes). par exemple :
byte[] b1 = new byte[] { 1 };
byte[] b2 = new byte[] { 1 };
int h1 = b1.GetHashCode();
int h2 = b2.GetHashCode();
Avec ce code, bien que les deux tableaux d'octets contiennent les mêmes valeurs, ils font référence à différentes parties de la mémoire et donneront lieu à des codes de hachage (probablement) différents. J'ai besoin que les codes de hachage de deux tableaux d'octets ayant le même contenu soient égaux.