我希望有一个包含两个case的枚举,每个case都有一个Hashable关联类型,每个都符合Hashable,如下所示:
enum WordOrNumber {
case Word(String)
case Number(Int)
}我对哈希的第一个想法是:
extension WordOrNumber: Hashable {
var hashValue: Int {
switch self {
case let .Word(word):
return word.hashValue & ~1 // ends in 0
case let .Number(number):
return number.hashValue | 1 // ends in 1
}
}
}我不确定的是,这将如何与Swift的Dictionary和Set实现中的bucket交互。
通过LSB或MSB来区分这两种情况更好,还是通过介于两者之间的某处来区分更好?
我假设将hashValues左移1然后再加1没有任何区别,但我很有兴趣知道情况是否如此。
编辑:我刚刚测试了一下,看起来Int的hashValue就是值本身。这显然是一个问题,因为您经常会连续获得Int,就像在枚举Bla: Int {}中一样。所以我的新的和改进的(?)hashValue是:
extension WordOrNumber: Hashable {
var hashValue: Int {
switch self {
case let .Word(word): // ends in 0
return word.hashValue << 1
case let .Number(number): // ends in 1
return number.hashValue << 1 &+ 1
}
}
}上面关于LSB和MSB的问题仍然存在。
发布于 2018-02-10 06:20:54
有这样的东西:
extension WordOrNumber: Hashable {
var hashValue: Int {
switch self {
case .Word(let value):
return value.hashValue
case .Number(let value):
return value.hashValue
}
}
static func ==(lhs: WordOrNumber, rhs: WordOrNumber) -> Bool {
switch (lhs, rhs) {
case (.Word(let lhsValue), .Word(let rhsValue)):
return lhsValue == rhsValue
case (.Number(let lhsValue), .Number(let rhsValue)):
return lhsValue == rhsValue
default:
return false
}
}
}..。应该足够了。
https://stackoverflow.com/questions/37254890
复制相似问题