2016-01-24 23 views
0

我想用我的類來創建一些屬性的一個唯一的標識符:添加hashValues一起使用位異或運算符或簡單地添加在一起

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/Int64代替):

var identifier: Int { return name.hashValue^array.map { $0.hashValue }.reduce(0) { $0^$1 }^check.hashValue } 

而且我已經看到人們在處理散列值時使用按位左移和右移操作符。這有什麼特別的理由嗎?

回答

1

之所以用^按位異或)在++可以溢出和崩潰的應用程序。

使用按位左移和右移操作符的原因是,如果數組順序不同,則生成不同的哈希值。如果你只是^沒有移位的散列值,那麼["a", "b"]["b", "a"]會產生相同的散列值。