この質問は、10genのMongoDBトレーニング中に発生し、実行可能なソリューションとしてハッシュが提示されます。URLのMD5ハッシュを生成することは、計算集約的であってはなりません。URL文字列を拡張するだけなので、base64エンコーディングは絶対にお勧めしません。
目標は、カーディナリティの高いインデックスを作成することですが、それはハッシュが一意である必要があるという意味ではありません。クエリにハッシュとURLの両方を含めると、選択性の高いハッシュインデックスを利用できるようになり、MongoDBはインデックスヒット間でURLを照合します。次の例では、両方のURLにハッシュ衝突があるとしましょう。
$ mongo --quiet
> db.urls.insert({_id: 1, url: "http://google.com", hash: "c7b920f"});
> db.urls.insert({_id: 2, url: "http://yahoo.com", hash: "c7b920f"});
> db.urls.find({hash: "c7b920f"})
{ "_id" : 1, "url" : "http://google.com", "hash" : "c7b920f" }
{ "_id" : 2, "url" : "http://yahoo.com", "hash" : "c7b920f" }
> db.urls.find({hash: "c7b920f", url: "http://google.com"})
{ "_id" : 1, "url" : "http://google.com", "hash" : "c7b920f" }
> db.urls.ensureIndex({hash: 1})
> db.urls.find({hash: "c7b920f", url: "http://google.com"}).explain()
{
"cursor" : "BtreeCursor hash_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"hash" : [
[
"c7b920f",
"c7b920f"
]
]
},
"server" : "localhost:27017"
}
コレクション全体でURLの一意性を保証するための追加のビジネス要件があるかどうかはわかりませんが、上記の例は、クエリの観点からは必要ないことを示しています。もちろん、どのハッシュアルゴリズムでも衝突の可能性がありますが、それでも1024バイトの制限を満たすMD5よりも優れたオプションがあります。