2014-06-16 13 views
23

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 property1property2 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?

+3

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 –

+0

Điểm tốt. Tôi cần đọc xong cuốn sách Swift. ;) – orj

+1

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

Trả lời

26

Theo đề nghị của Fabian Kreiser người ta có thể sử dụng các nhà khai thác tràn để làm cho phương pháp hashValue như sau:

var hashValue: Int { 
    return (31 &* property1.hashValue) &+ property2.hashValue 
} 

Giá trị vẫn tràn, nhưng ít nhất nó không sụp đổ

+7

Bạn có thể muốn chỉnh sửa câu trả lờ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

+0

nó có tạo ra sự khác biệt mà tôi chọn là property1 hoặc property2 không? giả sử property1 đi từ 0 đến 2 trong khi property2 đi từ 0 đến một số lớn n ... – kfmfe04

+0

Cách tiếp cận này làm chậm thời gian biên dịch của tôi xuống theo hệ số 10000. Xcode Version 8.0 (8A218a). –

Các vấn đề liên quan