C# GetHashCode() Высокопроизводительный алгоритм хеширования
-
11-12-2019 - |
Вопрос
Возможный дубликат:
Каков наилучший алгоритм для переопределенного 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...