2014-12-02 100 views
1

我很好奇,如果hashCode()函數總是返回一個拉姆達或Scala中的東西相同的值?Scala(方法/函數).hashCode靜態值?

我的測試向我展示了一些靜態值,即使在構建時也不會改變。這是預期的行爲還是將來會改變?

如果這是一些靜態行爲,它會幫助我建立我的圖書館很多。

編輯:

讓我們這個源代碼:

object Main { 
    def main(args: Array[String]): Unit = { 
    val x = (s: String) => 1 
    val y = (s: String) => 2 

    println(x.hashCode()) 
    println(y.hashCode()) 
    } 
} 

它是在控制檯輸出對我來說總是1792393294226170135

我目前正在做的是實現一個解析器組合器庫,我用多種語言實現。我需要知道封裝類是什麼時候是相同的(例如,底層函數是相同的),所以我可以實現類似調用堆棧的東西,我需要在失敗時儘可能地解析,但是防止無盡的遞歸出現錯誤。

在此先感謝!

+2

你的意思是2個相同的lambdas實例嗎?你能舉一個你想要的例子嗎? – 2014-12-02 15:38:17

+0

@BenReich我用示例和具體用例更新了我的問題。 – bash0r 2014-12-02 16:11:07

回答

5

hashCode(至少在Oracle JVM中)的默認實現是根據該特定對象的(初始)內存地址。因此,如果您的程序在構造該對象之前按完全相同的順序構造完全相同的大小對象,那麼實際上每次都會返回相同的值。

但這並不可靠;大多數程序在每次運行時都不會執行完全相同的操作。只要您做出響應用戶輸入的操作,完美的重現性就會消失 - 例如,也許你有時會添加足夠的條目到HashMap來觸發表的放大,有時不會。如果你稍後在程序中構造相同的值,它當然會有不同的地址;嘗試做

val z = (s: String) => 1 

,並觀察這將有來自x不同hashCode。更不用說,在不同的JVM,同一個JVM的不同版本,甚至是用不同的-Xms設置啓動相同的JVM時,這些數字可能會有所不同。

計算機在實踐中往往比理論上更具確定性。但這並不是指定要發生的事情,當然也不是你的程序中依賴的東西。

+0

感謝您的澄清!只要它在同一個運行中是相同的ID,我就可以忍受它。 – bash0r 2014-12-02 16:41:52

+4

如果您將它用作某種「唯一ID」,請記住'hashCode'可以爲不同的對象返回相同的值(但對於相同的對象不會有不同的值);如果兩個對象具有相同的'hashCode',則仍然應該使用equals來檢查它們是否「真正相等」。 – lmm 2014-12-02 16:43:37