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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам