it-swarm.com.de

GetHashCode () in Byte [] - Array

Was berechnet GetHashCode() beim Aufruf im byte[]-Array? Die beiden Datenarrays mit gleichem Inhalt bieten nicht denselben Hashwert.

48
Chesnokov Yuriy

Wie auch bei anderen nicht primitiv eingebauten Typen wird nur etwas beliebiges zurückgegeben. Es wird definitiv nicht versucht, den Inhalt des Arrays zu hashieren. Siehe diese Antwort.

14
mquander

Arrays in .NET überschreiben nicht Equals oder GetHashCode, daher basiert der Wert, den Sie erhalten, im Wesentlichen auf der Referenzgleichheit (z. B. der Standardimplementierung in Object). Für die Wertgleichheit müssen Sie Ihren eigenen Code rollen (oder einen anderen finden) von einem Dritten). Möglicherweise möchten Sie IEqualityComparer<byte[]> implementieren, wenn Sie Byte-Arrays als Schlüssel in einem Wörterbuch usw. verwenden möchten.

BEARBEITEN: Hier ist ein wiederverwendbarer Array-Gleichheitsvergleicher, der in Ordnung sein sollte, solange das Array-Element die Gleichheit angemessen behandelt. Beachten Sie, dass Sie das Array nicht mutieren dürfen, nachdem Sie es als Schlüssel in einem Wörterbuch verwendet haben. Andernfalls können Sie es nicht wiederfinden - selbst mit derselben Referenz.

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));
    }
}
57
Jon Skeet

byte[] erbt GetHashCode() von object, überschreibt es jedoch nicht. Was Sie also erhalten, ist im Grunde die Implementierung von object.

10
rickythefox

Wenn es sich nicht um dieselbe Instanz handelt, werden unterschiedliche Hashes zurückgegeben. Ich vermute, es basiert auf der Speicheradresse, wo es irgendwie gespeichert wird. 

1
jishi

Einfache Lösung

    public static int GetHashFromBytes(byte[] bytes)
    {
        return new BigInteger(bytes).GetHashCode();
    }
0
Daniil Sokolyuk