2016-06-01 78 views
0

考慮這個結構散列值具有不同特性的兩個對象是同一

struct Node : Hashable { 
let value : Int 
let i : Int 
let j : Int 

init(withValue val : Int, position : (Int,Int)){ 
    value = val 
    self.i = position.0 
    self.j = position.1 
} 

var hashValue: Int { 
    return "\(value),\(i),\(j)".hashValue 
} 
} 

==操作

func ==(left: Node, right: Node) -> Bool { 
    return left.hashValue == right.hashValue 
} 

當我創建2個節點:

let node1 = Node(withValue: 1260, position: (8,694)) 
let node2 = Node(withValue: 33, position: (257,286)) 

並加以比較:

node1 == node2 //true ??? 

爲什麼hashValue函數無法按預期工作?

它應該以不同的方式實施嗎?

反問題:如果是,那麼爲這種對象計算hashValue的正確方法是什麼?

更多信息

當我調試此:

(lldb) po node1.hashValue 
4799450060528192039 

(lldb) po node2.hashValue 
4799450060528192039 
+2

哪裏是你的init方法? –

+0

對不起,忘了複製:D現在加入! – prad

+1

http://stackoverflow.com/questions/31438210/how-to-implement-the-hashable-protocol-in-swift-for-an-int-array-a-custom-strin – oremag14jf

回答

3

平等散列值不等於保證原始值。的hash collisions整個概念存在只是爲了這個原因:

在計算機科學中,碰撞衝突是在兩個不同的數據塊具有相同的哈希值時出現的情況...

每當一個非常大的集合(例如所有可能的人名或所有可能的計算機文件)成員映射到相對較短的位串時,碰撞是不可避免的。

這意味着,這個實現==操作是錯誤的:

func ==(left: Node, right: Node) -> Bool { 
    return left.hashValue == right.hashValue 
} 

相反,它應該是:

func ==(left: Node, right: Node) -> Bool { 
    return left.value == right.value 
     && left.i == right.i 
     && left.j == right.j 
} 
相關問題