41 votes

Comment fonctionne l'implémentation native de ValueType.GetHashCode ?

J'ai créé deux structures de type TheKey k1={17,1375984} et k2={17,1593144}. Évidemment, les pointeurs dans les deuxièmes champs sont différents. Mais les deux obtiennent le même code de hachage = 346948941. On s'attend à voir différents codes de hachage. Voir le code ci-dessous.

 struct TheKey
{
    public int id;
    public string Name;

    public TheKey(int id, string name)
    {
       this.id = id;
       Name = name;
   }
}

static void Main() {
    // assign two different strings to avoid interning
    var k1 = new TheKey(17, "abc");
    var k2 = new TheKey(17, new string(new[] { 'a', 'b', 'c' }));

    Dump(k1); // prints the layout of a structure
    Dump(k2);

    Console.WriteLine("hash1={0}", k1.GetHashCode());
    Console.WriteLine("hash2={0}", k2.GetHashCode());
}

unsafe static void Dump<T>(T s) where T : struct
{
    byte[] b = new byte[8];
    fixed (byte* pb = &b[0])
    {
        IntPtr ptr = new IntPtr(pb);
        Marshal.StructureToPtr(s, ptr, true);

        int* p1 = (int*)(&pb[0]); // first 32 bits
        int* p2 = (int*)(&pb[4]);

        Console.WriteLine("{0}", *p1);
        Console.WriteLine("{0}", *p2);
    }
}

Sortir: 17 1375984 17 1593144 hash1=346948941 hash2=346948941

5voto

David Heffernan Points 292687

k1 et k2 contiennent les mêmes valeurs. Pourquoi êtes-vous surpris qu'ils aient le même code de hachage ? Il est contracté pour renvoyer la même valeur pour deux objets qui se comparent comme égaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X