使用Bitwise XOR运算符将hashValues添加到一起或简单地将它们一起添加

时间:2016-01-24 10:08:34

标签: swift hash bitwise-operators

我想使用以下方法在我的班级中创建一些属性的唯一标识符:

class Foo {
    var name = "John"
    var array = ["string1", "string2"]

    var check: Bool { return name.isEmpty }

    var xor: Int { return name.hashValue ^ check.hashValue }
    var add: Int { return name.hashValue + check.hashValue }
}

let test = Foo()

print(test.xor) // prints 4799450059756749538
print(test.add) // prints 4799450059756749538

没有问题。

但是在阅读一些教程时,一些网站使用运算符^将哈希值“添加”在一起。

我的问题是,如果我使用运算符^来计算identifier,它是否会产生任何(负面)影响?因为当我计算数组的哈希值时,我不能使用运算符+而我被迫使用^代替(除非我使用Int32 / {{1而不是):

Int64

我也看到人们在处理哈希值时使用按位左移和右移运算符。这有什么特别的原因吗?

1 个答案:

答案 0 :(得分:1)

^上使用+按位异或)的原因是+可能会溢出并导致您的应用崩溃。

使用按位左移和右移运算符的原因是,如果数组顺序不同,则生成不同的散列值。如果您只是^哈希值而没有移位,那么["a", "b"]["b", "a"]会生成相同的哈希值。