0

インスタンス メソッドが 1 つ見つかりましHash#initialize_copyた。しかし、何も文書化されていません。この点で、誰かがコードで私を助けることができますか?

はどのようにHash#hashハッシュ コードを計算しますか? その背後にあるロジックは何ですか?ハッシュ コードが使用されるシナリオは何ですか? ハッシュの各キー、たとえばhは常に異なるハッシュ コードを持っていますか?

編集

私は以下を試しました:

C:\Documents and Settings\rakshiar>irb
irb(main):001:0> h=Hash.new
=> {}
irb(main):002:0> h["a"]=2
=> 2
irb(main):003:0> h["b"]=2
=> 2
irb(main):004:0> "a".hash
=> 100
irb(main):005:0> "b".hash
=> 101
irb(main):006:0> h1=Hash.new
=> {}
irb(main):007:0> h1["a"]=2
=> 2
irb(main):008:0> h1["b"]=2
=> 2
irb(main):009:0> "a".hash
=> 100
irb(main):010:0> "b".hash
=> 101
irb(main):011:0> exit

しかし、2 つのハッシュの組み合わせh and h1が同じであることがわかります。key/valueしかし、それらのハッシュ コードもどのように同じなのでしょうか? ドキュメントにも記載されています-私は知っています。しかし、その理由は何ですか?-誰か明確にしてください?

4

2 に答える 2

2

What are the scenarios where hash codes are used?

「b ={}」という言葉を覚えていますか? 今 b はハッシュであり、何かを挿入するたびに、ハッシュコードを使用して新しい要素を配置します。インスタンスや他のほとんどすべてのハッシュ操作でキーによって値を取得するために同じことが使用されます。

Does each key of a hash, say h, always have different hash code?

いいえ、それはほとんど不可能です。ただし、衝突が発生したときに異なるアルゴリズムを適用できる (および適用する) ため、同じハッシュを持つ 2 つの要素が互いに置き換えられることは決してありません。

How does Hash#hash compute hash code?What is the logic behind it?

ハッシュはオブジェクトの種類ごとに異なる方法で計算されるため、これは少し大雑把で一般的な質問です。本当に重要なの、メソッドhashがそのために呼び出されることです。したがって、このメソッドをオーバーライドすると、オブジェクトのハッシュ コードを好きなように設定できます。

于 2013-01-14T13:21:44.140 に答える
1

基本的に、とinitialize_copyによって使用されるいくつかの内部的なものを実行します(Jon Leightonはそれについてブログに書いています)。彼が指摘しているように、それが何をしているのかを心配する必要はありませんが、本当に興味がある場合は、ソースを掘り下げることができます。clonedup

Hash2つ目のポイントについては、クラスとhashメソッドの間で混乱していると思います。

Hashクラスは、私たち全員が知っていて愛しているデータ構造です。

hashメソッドはすべてのオブジェクトで定義され、そのオブジェクトの「ハッシュコード」を返します。オブジェクトの種類が異なれば、ハッシュコードの計算方法も異なる可能性があります。これらのコードは、Hashキーを検索するためにデータ構造によって内部的に使用されます(これらの「ハッシュテーブル」の詳細については、 Wikipediaを参照してください)。

そのため、この例"a".hashでは常に同じです(そして、重要なことに、常に "b" .hashとは異なります) 。これは、(メソッド)が(で使用されているにもかかわらず)および(es)の"a".hash影響を受けないためです。hh2Hash

于 2013-01-14T14:04:13.777 に答える