Как переопределить GetHashCode на Hashtable? - PullRequest
0 голосов
/ 04 мая 2018

Я бы хотел переопределить метод GetHashCode для хеш-таблицы в C #.

Я использую хеш-таблицу в качестве многомерного ключа в сложном объекте.

Как это можно сделать?

Различные порядки ключей в hKey должны возвращать одинаковые hashCode.

Что-то вроде этого не работает:

Hashtable hkey; 

int i = 0;
foreach (DictionaryEntry de in hkey)
    i ^= de.GetHashCode();

return i;

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Хорошо, это работает нормально, спасибо всем

    static void Main(string[] args)
    {
        Hashtable h = new Hashtable()
        {
          { "string1", 1 },
          { "string2", 2 }
        };

        int i = GetHashCode(h);

        h = new Hashtable()
        {
          { "string2", 2},
          { "string1", 1 }
        };

        int j = GetHashCode(h);

        Debug.Assert(i == j);

        h = new Hashtable()
        {
          { "string1", 1 },
          { "string2", 2 }
        };

        i = GetHashCode(h);

        h = new Hashtable()
        {
          { "string2", 3},
          { "string1", 1 }
        };

        j = GetHashCode(h);

        Debug.Assert(i != j);
    }

    static int GetHashCode(Hashtable ht)
    {
        if (ht.Count == 0) return ht.GetHashCode();

        int h = 0;
        foreach(DictionaryEntry de in ht)
        {
            h ^= new { de.Key, de.Value }.GetHashCode();
        }
        return h;
    }
0 голосов
/ 04 мая 2018

Вы можете переопределить GetHashCode () Hashtable, если вы расширите его так:

public class MyHashtable : Hashtable
{
    public override int GetHashCode()
    {
        const int seed = 1009;
        const int factor = 9176;

        var hash = seed;
        foreach (var key in Keys)
        {
            hash = hash * factor + key.GetHashCode();
        }

        return hash;
    }
}

Константы были взяты из этого ответа: https://stackoverflow.com/a/34006336/8006950

Подробнее о хешировании: http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

...