Clojure がマップの実装に 32 ビット ハッシュを使用することを考慮して、Clojure マップに 2^32-1 キーの制限があるかどうか (および、これが正しくない場合、衝突をどのように管理するか)、およびそのハッシュ実装は一貫しています。ティア!
1 に答える
11
Clojure マップは、永続的で不変のカスタム実装です(つまり、不変データ構造で使用すると十分なパフォーマンスが得られない Java ハッシュマップを使用しません)。
32 ビットのハッシュ コードを使用するため、2^32 個のハッシュ バケットが可能です。衝突の場合、キーと値は各ハッシュ バケットの配列に格納されるため、2^32 個を超えるキーを持つことができます。PersistentHashMap ソースを参照してください。特に、HashCollisionNode 内部クラスは、単一のハッシュコード値に対するキー/値のバケットを格納するために使用されます。
可能なハッシュ バケットの数は固定されているため、一貫したハッシュは無関係です。キーを再マッピングする必要はありません。
以下も参照してください。
- http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey (同時実行に対する Clojure のアプローチを説明するプレゼンテーションですが、永続的な不変データ構造もカバーしています)
于 2012-06-18T17:02:04.167 に答える