我想使用以下方法在我的班级中创建一些属性的唯一标识符:
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
我也看到人们在处理哈希值时使用按位左移和右移运算符。这有什么特别的原因吗?
答案 0 :(得分:1)
在^
上使用+
(按位异或)的原因是+
可能会溢出并导致您的应用崩溃。
使用按位左移和右移运算符的原因是,如果数组顺序不同,则生成不同的散列值。如果您只是^
哈希值而没有移位,那么["a", "b"]
和["b", "a"]
会生成相同的哈希值。