2017-09-04 79 views
0

我目前正在研究一種圖形數據類型,在這種情況下,我已經考慮了很多關於身份和平等的語義問題。等於是否意味着相等的散列值?

我現在的情況如下。我有一個Vertex類型:

final class Vertex<T>: Hashable { 

    static func ==(lhs: Vertex, rhs: Vertex) -> Bool { 
    return lhs === rhs 
    } 

    var value: T 

    var hashValue: Int { 
    return ObjectIdentifier(self).hashValue 
    } 

} 

正如你所見,平等是由身份決定的。我之所以這樣做是出於圖形數據類型的特定原因,但它基本上涉及的是頂點應該通過它們的標識來查看,因此如果它們相同(相同的)頂點。

現在哈希值也由身份確定(使用ObjectIdentifier)。這似乎是獲得散列值的最簡單方法,並且似乎與此類型的平等概念保持一致。

但是,這讓我想...
難道是語義上「不正確」(或不合邏輯的,如果你願意),以確定由哈希值,讓我們說,在value屬性(如果T符合Hashable)。
在這種情況下,兩個Vertex可以一致地具有相同的散列值(不只是對於程序的一次調用),而不被認爲是相等的。這看起來不正確。

因此反過來說:是否明智地說實例的平等意味着它們的散列值是相等的?

回答

2

Hashable的文檔:

「的散列值,通過A型的散列值屬性設置,是一個整數,它是該同樣比較任何兩個實例相同即,對於兩個實例一。和b是相同的類型,如果a == b,則a.hashValue == b.hashValue。反過來不正確:具有相同散列值的兩個實例不一定相等。

換句話說,如果==回報truehashValue必須返回兩個對象相同的值。

1

哈希的要求是,如果兩個值ab是相同的,然後a.hashvalue == b.hashvalue。但是,這並不意味着反過來是真實的。如果兩個散列值相同,那麼散列項可能不相同。所以當你說

  • 「實例的平等應該暗示他們的哈希值是否相等?」這實際上是一個要求。
  • 「兩個頂點可以有一致的哈希值(不僅僅是一次調用程序),而不會被認爲是相等的。這看起來不正確」 - 事實上這是可能的。