12

背景:比較的遅いバックエンドサービスのキャッシングレイヤーとして機能するアプリケーション(元のエンジニアが去る)を引き継いでいますこれはRESTfulスタイルのURLであるため、各URLは一意です。アプリケーションは、キャッシュのストレージとしてMongoDbを使用し、キャッシュとしてハッシュ値を使用します。ハッシュコードはかなり一意である必要がありますが、一意ではありません。

質問:(URLの代わりに)ハッシュコードを使用する理由は、MongoDbの_idフィールドの長さに制限があるためだと言われましたが、そのドキュメントが見つかりません。MongoDbのドキュメントで見つけることができるのは、「_ idフィールドは、一意である限り、配列以外の何でもかまいません」ということだけです。MongoDbの_idフィールドに長さ制限があるというのは本当ですか?もしそうなら、制限サイズは何ですか?

アプリケーションはJavaで書かれています。ああ、私はMongoDbを初めて使用します。

4

2 に答える 2

14

インデックスを作成するフィールドの長さには、1024バイトの制限があります。これは、最大16MB(完全なドキュメントの最大サイズ)に制限されているドキュメントフィールドサイズではなく、インデックスエントリサイズの制限です。

パフォーマンス上の理由から、このような大きな値との比較はかなり遅いため、インデックス付きフィールドに大きなフィールド値は実際には必要ありません。また、すべてのインデックスはインデックス付けされる値のコピーを保持するため、大量のメモリが必要になることを忘れないでください。つまり、仮想メモリページをメモリの内外にスワップするためのディスクアクセスの頻度が高くなり、パフォーマンスに悪影響を及ぼします。

そうです、800バイトに制限されています。

于 2012-04-19T08:27:54.963 に答える
4

十分な長さのハッシュ値を持つ優れたハッシュ関数を使用している場合、ハッシュの衝突はまれです。たとえば、ハッシュが128ビット値を出力する場合、通常は2 ^ 64のハッシュを生成した後に衝突が発生します。したがって、1秒間に100万のハッシュを生成した場合、約60万年後に衝突が発生します。これはおそらくほとんどの目的に十分です。

于 2014-05-01T12:34:24.950 に答える