Написание хорошей реализации Hashable в Swift
В Objective-C (и других языках) относительно хорошая реализация по умолчанию - (NSUInteger)hash
возможно:
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
Предполагая, что оба property1
а также property2
вернуть хорошие значения для hash
,
Это не работает в эквиваленте Swift var hashValue: Int
метод, определенный на его Hashable
протокол.
Эквивалентный код Swift может переполниться, и это ошибка во время выполнения в Swift.
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
Итак, мой вопрос, каков наилучший метод для генерации значений хеша (реализации Hashable) в Swift? Должен ли я просто использовать XOR? Хотя я понимаю, что XOR не идеален для создания равномерных хеш-распределений. Возможно, что-то более экзотическое?
1 ответ
По предложению Фабиана Крейзера можно использовать операторы переполнения для создания метода hashValue следующим образом:
var hashValue: Int {
return (31 &* property1.hashValue) &+ property2.hashValue
}
Значение по-прежнему переполняется, но по крайней мере не падает