對象散列值的含義是什麼?在這種情況下,兩個對象具有相同的哈希值?另外據說Array | Hash不能是哈希鍵,這與對象的哈希值有關,爲什麼?ruby object.hash
回答
對於對象存儲在包含HashMap或hashsets以下必須成立:
如果兩個對象被認爲是平等的,他們的哈希值也必須相等。
如果兩個對象不相同,它們的散列值應該可能不同(兩個不同的對象具有相同的散列值越頻繁,散列映射/集上的操作性能越差)。
因此,如果兩個對象具有相同的散列值,那麼它們是平等的(但不能保證)。
以上所說的「相等」意思是指哈希方法的實現者。但是,您應該始終使用eql?
來使用與散列相同的相等定義。
對於不重寫散列的類(即使用Object的散列實現的類),散列相等性是根據對象標識定義的。即當且僅當駐留在內存中的相同位置時,兩個對象被認爲是相等的。
紅寶石達1.8.6陣列和哈希沒有覆蓋hash
。因此,如果您使用數組(或散列)作爲散列鍵,那麼如果您使用完全相同的數組作爲檢索鍵(而不是具有相同內容的數組),則只能檢索鍵的值。
紅寶石1.8.7+ Array#hash
和Hash#hash
(以及它們的eql?
方法)被定義爲當它們的元素相等時它們是相等的。
散列值沒有固有含義,但它是一種表示該對象的方式,以便它可以與其他相同類型的對象區分開來。當你創建一個對象時,它需要實現散列,這樣如果兩個對象具有相同的散列值,它們也將相等。兩個對象相等的意義取決於對象;如果您定義了一個Person對象,那麼您可能想要說,如果Person的兩個實例具有相同的名稱,ID號和出生日期,則它們是相等的。或者選擇任何標準。
將數組或散列用作散列鍵現在可以工作,因爲兩者都執行散列(例如散列值基於其內容)。但是,如果有可能修改它,則在使用可修改對象(如數組)作爲關鍵字時,可能會遇到麻煩。例如,如果您有一個Array類型的變量,並將其用作將某些內容放入哈希中的關鍵字,然後將某些內容添加到該數組中,並嘗試將該變量用作重新獲取某些內容的鍵的哈希,它不會工作(因爲數組的哈希值已更改)。解決此問題的方法是在修改陣列後,在您的散列上調用Rehash。
你在找什麼是hashing的概念。 這不僅僅是對象,更廣泛的概念。
- 1. Foo <Ruby in Ruby
- 2. Ruby與Ruby On Rails
- 3. ruby 1.8 to 1.9 ruby -v顯示ruby 1.9.2p0
- 4. Ruby Cucumber - 添加Ruby代碼
- 5. rubysdl與ruby-sdl-ffi
- 6. Ruby/Ruby on Rails vs PHP
- 7. Ruby on Rails bcrypt-ruby錯誤
- 8. Ruby和Rails或Ruby on Rails
- 9. RVM + Ruby 1.9.1 + ruby-debug =錯誤?
- 10. Ruby 1.8.7 vs Ruby企業
- 11. 「ruby script.rb」與「xterm -e ruby script.rb」
- 12. Ruby 1.9比Ruby 1.8慢?
- 13. ruby and ruby on rails book(2009)
- 14. 學習Ruby和Ruby on Rails
- 15. Ruby,Watir和Ruby Mine入門?
- 16. Ruby企業版和Ruby 1.9
- 17. 通過RPC訪問Ruby從Ruby通過RPC訪問Ruby
- 18. Ruby Debug IDE錯誤:ruby-debug-ide-0.4.9/lib/ruby-debug-ide.rb:109:`debug_load'
- 19. 使用Ruby Enterprise v1.8.7安裝ruby-debug/ruby-debug-base時出錯
- 20. Ruby Gemfile與Ruby版本不匹配,但匹配ruby -v輸出
- 21. Ruby PostgreSQL
- 22. 對Ruby
- 23. Ruby LittleLexer
- 24. Ruby - STDIN.read
- 25. Ruby Math.radians
- 26. Ruby類
- 27. 用Ruby
- 28. ruby operator「=〜」
- 29. 用Ruby
- 30. ruby request.query_string