C# GetHashCode() Высокопроизводительный алгоритм хеширования
Возможный дубликат:
Какой лучший алгоритм для переопределенного 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 для двух экземпляров Laptop, у которых все определенные выше поля совпадают друг с другом, что требует переопределения Equals
а также GetHashCode
метод, а также другое требование, как вы можете видеть, это то, что это производный класс, который может быть использован повторно и поддерживать ряд методов; и, таким образом, не может быть сделан тип значения (структура). Я попытался с 2 экземплярами вышеупомянутого типа со всеми соответствующими полями экземпляра, и если я использую базовую реализацию Equals
- возвращается false
где я хочу, чтобы это было true
..Как бы я поддержал такой сценарий?
1 ответ
Это зависит от типа, в котором он реализован, но он должен давать хороший разброс значений, и GetHashCode() НЕ ДОЛЖЕН возвращать уникальные значения. Он должен основываться на тех полях, которые используются в вашей реализации Equals, и эти поля должны быть неизменными. Таким образом, требования для Equals/GetHashCode одинаковы для структур и классов.
И, как сказал Хенк, лучше вообще не переопределять Equals/GetHashCode...