2010-06-13 5 views
0

Je me sens mal à poser cette question, mais je ne suis pas en mesure actuellement de programmer et de tester cela car j'écris ceci sur mon téléphone portable et non sur ma machine dev: P (Points de repre facile si quelqu'un répond! XD)Tableaux/listes et valeurs de calcul (VB, C#)

Quoi qu'il en soit, j'ai eu de l'expérience avec l'utilisation de hashvalues ​​à partir d'objets String. Par exemple, si StringA et StringB sont tous les deux égaux à "foo", ils calculeront tous deux la même valeur de hachage, car ils ont des valeurs égales.

Maintenant, que se passe-t-il si j'ai une liste, avec T étant un type de données natif. Si j'essayais de calculer la hashvalue de ListA et ListB, en supposant qu'elles aient toutes les deux la même taille et contiennent la même information, n'auraient-elles pas aussi des hashvalues ​​égales?

En supposant que jeu de données de l'échantillon de « octet » avec une longueur de 5 {5,2,0,1,3}

+0

Qu'entendez-vous par "calculer la hashvalue de ListA et ListB"? Voulez-vous dire la valeur de hachage pour chaque élément de la liste être le même - si oui alors oui. Sinon, je ne pense pas qu'ils seront les mêmes .. – VoodooChild

+0

Par exemple, ListA.Hashvalue = ListB.Hashvalue? Je ne sais pas si .Net fait cela même –

Répondre

0

Si vous parlez des types de liste intégrés, alors non, ils ne seront pas égaux. Pourquoi? Parce que List<T> est un type de référence, l'égalité fera une comparaison pour voir si les références sont les mêmes. Si vous créez un type de liste personnalisé, vous pouvez remplacer les méthodes Equals et GetHashCode pour prendre en charge ce comportement, mais cela ne se produira pas sur les types intégrés.

2

Cela dépend de la façon dont on calcule la valeur de hachage et comment vous définissez l'égalité. Par exemple, deux instances différentes d'un tableau qui contiennent les mêmes valeurs peuvent ne pas être considérées comme égales selon votre application. Dans ce cas, vous pouvez inclure l'adresse ou une autre valeur unique par tableau dans le cadre de la fonction de hachage. Toutefois, si vous souhaitez prendre en compte des tableaux distincts contenant les mêmes valeurs, vous devez calculer le hachage de liste en utilisant uniquement les valeurs du tableau. Bien sûr, alors vous devez considérer si commander vous importe ou non pour déterminer l'égalité (et ainsi influencer votre fonction de hachage).

+0

Oui, l'ordre serait important. N'a pas pensé à cela, mais oui, il serait critique –

+0

+1, en ce qui concerne l'égalité: vous pouvez surcharger l'opérateur d'égalité, non? – VoodooChild

1

Si l'ordre des éléments est important, vous pouvez générer un code de séquence comme celui-ci.

public static int GetOrderedHashCode<T>(this IEnumerable<T> source) 
{ 
    unchecked 
    { 
     int hash = 269; 
     foreach (T item in source) 
     { 
      hash = (hash * 17) + item.GetHashCode; 
     } 
     return hash; 
    } 
} 

Si l'ordre des éléments est pas important, alors vous pourriez faire quelque chose comme ceci:

public static int GetUnorderedHashCode<T>(this IEnumerable<T> source) 
{ 
    unchecked 
    { 
     int sum = 907; 
     int count = 953; 
     foreach (T item in source) 
     { 
      sum = sum + item.GetHashCode(); 
      count++ 
     } 
     return 991 * sum * count; 
    } 
} 

(Notez que ces deux méthodes auront de mauvaises performances pour les grandes collections, où cas, vous voudrez peut-être implémenter une sorte de cache et ne recalculer le hashcode que lorsque la collection changera.)