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

Значение все еще переполняется, но, по крайней мере, оно не падает