Как хешировать универсальный ключ в реализации универсальной хеш-таблицы? - PullRequest
1 голос
/ 20 февраля 2012

Я реализую хеш-таблицу с использованием обобщений, таких как словарь, реализованный в c #, но я застрял в части функции Hash. Я успешно переписал неуниверсальную реализацию хэш-таблицы в общую, но вы заметите в коде, что я не знаю, как хэшировать Tkey.

class Node<T, U>
{
    public T key;
    public U value;
    public Node<T, U> next;
    public Node(T key, U value, Node<T, U> next)
    {
        this.key = key;
        this.value = value;
        this.next = next;
    }
 }

public  class HashTable<T,U>
{
    int length;
    Node<T,U>[] buckets;
    public HashTable(int length)
    {
        this.length = length;
        buckets = new Node<T,U>[length];
    }

    public void Display()
    {
        for (int bucket = 0; bucket<buckets.Length; bucket++)
        {
            Node<T,U> current = buckets[bucket];
            Console.Write(bucket + ":");
            while (current != null)
            {
                Console.Write("["+current.key+","+current.value+"]");
                current=current.next;
            }
            Console.WriteLine();
        }
    }
     //  private int Hash(T Tkey) ...
    //// non-generic version of hash function

    private int Hash(string str)
    {
        int h=0;
        foreach(var s in str)
            h=127*h+s;
        return h%length;

    }
     ////
    public void Insert(T key, U value)
    {
        int bucket = Hash(key);
        buckets[bucket] = new Node<T,U>(key, value, buckets[bucket]);
    }
    public U Search(T key)
    {
        Node<T,U> current = buckets[Hash(key)];
        while (current != null)
        {
            if (current.key.Equals(key))
                return current.value;
            current= current.next;
        }
        throw new Exception(key+ "Not found");
    }

1 Ответ

3 голосов
/ 20 февраля 2012

Базовый класс объектов в C # поставляется с методом GetHashCode(), который следует использовать в этих ситуациях.

Некоторые классы имеют хорошую реализацию, другие просто наследуют метод от System.Object и не переопределяют его.

Из документации MSDN:

Реализация по умолчанию метода GetHashCode не гарантирует уникальных возвращаемых значений для различных объектов. Кроме того, .NET Framework не гарантирует реализацию по умолчанию метода GetHashCode, и возвращаемое значение будет одинаковым для разных версий .NET Framework. Следовательно, реализация по умолчанию этого метода не должна использоваться в качестве уникального идентификатора объекта для целей хеширования.

Метод GetHashCode может быть переопределен производным типом. Типы значений должны переопределять этот метод, чтобы обеспечить хеш-функцию, подходящую для этого типа, и обеспечить полезное распределение в хеш-таблице. Для уникальности хэш-код должен основываться на значении поля или свойства экземпляра, а не на статическом поле или свойстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...