Написание хорошей реализации 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 
}

Значение по-прежнему переполняется, но по крайней мере не падает

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