Trong Objective-C (và các ngôn ngữ khác) một thực hiện mặc định tương đối tốt của - (NSUInteger)hash
có thể là:Viết một thực hiện Hashable tốt trong Swift
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
Giả sử cả hai property1
và property2
trở lại giá trị tốt đẹp cho hash
.
Tính năng này không hoạt động theo phương thức tương đương var hashValue: Int
của Swift được xác định trên giao thức Hashable
của Swift.
Mã Swift tương đương có khả năng tràn và đây là lỗi thời gian chạy trong Swift.
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
Vì vậy, câu hỏi của tôi là kỹ thuật tốt nhất để tạo giá trị băm (triển khai Hashable) trong Swift là gì? Tôi có nên sử dụng XOR không? Mặc dù sự hiểu biết của tôi là XOR không lý tưởng cho việc tạo các bản phân phối băm đồng nhất. Có lẽ một cái gì đó kỳ lạ hơn?
Bạn chỉ có thể sử dụng các toán tử tràn (& + và & *) để cho phép tràn số nguyên trong phép tính băm của bạn. https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/AdvancedOperators.html –
Điểm tốt. Tôi cần đọc xong cuốn sách Swift. ;) – orj
Bạn có thể muốn chỉnh sửa câu hỏi của mình. hashValue không phải là một func. Thay vào đó, nó là một thuộc tính tính toán. – pohl