2017-06-13 5 views
2

ES6では、マップとセットでオブジェクトをキーとして使用できます。しかし、ES6の仕様はこれらのデータ構造の基本的な実装を規定していないので、O(1)または少なくともsublinearの検索を保証するために現代のJSエンジンがキーをどのように格納しているのだろうか?ES6マップとセット:オブジェクトキーはどのように効率的に索引付けされますか?

Javaのような言語では、プログラマは明示的に(良好な)hashCodeメソッドを提供することができます。このメソッドは、キースペース内でキーを均等にハッシュして、パフォーマンスを保証します。しかし、JSにはこのような機能がないため、MapsおよびSetsの実装で何らかのハッシュを使用していると見なすのはまだ公正ですか?

すべての情報をお待ちしております!

+0

もちろん、ハッシュを使用します。独自の等価を指定することはできないため、独自のハッシュ関数を実装する必要はありません。彼らは単にオブジェクトのアイデンティティに使用します。 – Bergi

+1

[es6 Map and Set Complexity、v8 implementation](https://stackoverflow.com/q/33611509/1048572)の複製がありますか?それがあなたの質問に答えるなら、私は終わります。 – Bergi

+0

ああ、私は彼らが平等をチェックするためにオブジェクトアイデンティティーを使用することを理解するので、私は理解します。しかし、彼らはどのようにハッシュ位置を取得するのですか?いくつかの種類のmemoryAddress%keySpace? – luanped

答えて

3

はい、実装はハッシュに基づいており、一定のアクセス時間があります(償却されます)。

「オブジェクトアイデンティティを使用しています」は単純化されています。 ES Maps and SetsではSameValueZeroアルゴリズムを使用して、同等性を判断しています。

V8の実装では、文字列と数字の「実際の」ハッシュを計算し、乱数をオブジェクトの「ハッシュ」として選択し、後でアクセスするためにこれらのオブジェクトに非公開のプロパティとして格納します。

memoryAddress % keySpaceを使用すると、ガベージコレクタはオブジェクトを移動させ、オブジェクトが移動した可能性があるたびにすべてのマップとセットを再ハッシュするため、機能しません(これは理想的ではなく、将来変更される可能性があります)。法外に複雑で高価になる。

関連する問題