C# GetHashCode() Высокопроизводительный алгоритм хеширования

StackOverflow https://stackoverflow.com//questions/10667938

Вопрос

Возможный дубликат:
Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?

Нам известно, что если мы переопределим Equals метод Object в наших пользовательских типах мы также должны переопределить и обеспечить реализацию GetHashCode метод поддержки генерации уникальных хэш-кодов для использования в поддержке Hashtable и Dictionary классы коллекций и могут быть другими классами.

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

Мой вопрос в том, чтобы какие алгоритмы хеширования точны и обеспечивают оптимальную производительность при использовании в GetHashCode выполнение?Или нам следует использовать только базовый тип GetHashCode выполнение?Я хотел бы знать этот ответ для обоих value types и reference types..

Редактировать:Ниже приведен пример класса, объясняющий, почему мне нужно переопределить Equals:

public class Laptop : LaptopBase
{
    public readonly string Make;
    public readonly string ProcessorArch;
    public readonly int MemorySupported;
    public readonly int HardDiskGBSupported;
    public readonly Color ColorName;

    public Laptop(make, procArch, memorySupp, hdGB, color)
    {
        Make = make;
        ProcessorArch = procArch;
        MemorySupported = memorySupp;
        HardDiskGBSupported = hdGB;
        ColorName = color;
    }
}

Теперь я хочу вернуть true для двух экземпляров ноутбука, у которых все указанные выше поля совпадают друг с другом, поэтому необходимо переопределить Equals и GetHashCode метод, а также еще одно требование, как вы можете видеть, заключается в том, что это производный класс, который можно использовать повторно и поддерживать ряд методов;и, следовательно, его нельзя сделать типом значения (структурой).Я попробовал использовать 2 экземпляра вышеуказанного типа со всеми совпадающими полями экземпляра, и если я использую базовую реализацию Equals - оно возвращается false где я хочу, чтобы это было true.. Как бы я поддержал такой сценарий?

Это было полезно?

Решение

Это зависит от типа, в котором он реализован, но он должен давать хорошую дисперсию значений, и НЕ обязательно, чтобы GetHashCode() возвращал уникальные значения.Он должен основываться на тех полях, которые используются в вашей реализации Equals, и эти поля должны быть неизменяемыми.Таким образом, требования к Equals/GetHashCode одинаковы для структур и классов.

И, как сказал Хенк, лучше вообще не переопределять Equals/GetHashCode...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top