Swift中的Hasling enum

时间:2016-05-16 13:16:48

标签: swift hash enums

我想要一个包含两个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的字典和集合实现中的存储桶进行交互。

用LSB或MSB区分这两种情况,或者在中间某处区分这种情况会更好吗?

我认为将hashValues向左移动一个然后再加1是没有任何区别,但我有兴趣知道这是不是这样。

编辑: 我刚测试了这个,看起来Int的hashValue就是值本身。这显然是一个问题,因为你经常连续得到一些内容,比如枚举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的上述问题仍然存在。

1 个答案:

答案 0 :(得分:1)

有类似的东西:

.html

......应该够了。