Hintergrund: Ich habe eine Anwendung übernommen (der ursprüngliche Entwickler verlässt sie), die als Caching-Schicht einiger relativ langsamer Backend-Dienste fungiert. Da es sich um eine URL im REST-Stil handelt, ist jede URL eindeutig. Die Anwendung verwendet MongoDb als Speicher für den Cache und verwendet den Hash-Wert als Cache. Obwohl der Hash-Code ziemlich einzigartig sein sollte, ist er nicht eindeutig.
Frage: Mir wurde gesagt, dass der Grund für die Verwendung von Hash-Code (anstelle der URL) darin liegt, dass das _id-Feld von MongoDb eine Beschränkung der Länge hat, aber ich kann dazu kein Dokument finden. Alles, was ich in der MongoDb Dokumentation finden kann, ist "_id Feld kann alles andere als Array sein, solange es einzigartig ist". Stimmt es, dass das _id-Feld von MongoDb eine Längenbeschränkung hat? Wenn ja, wie groß ist die Grenzgröße?
Die Anwendung ist in Java geschrieben. Oh, und ich bin neu in MongoDb.
Die Länge des zu indizierenden Felds ist auf 1024 Byte beschränkt. Das ist eine Einschränkung für die Indexeintragsgröße und nicht für die Dokumentfeldgröße, die auf ~ 16 MB begrenzt sind (die maximale Größe eines vollständigen Dokuments).
Aus Leistungsgründen möchten Sie nicht wirklich große Feldwerte für indizierte Felder, da Vergleiche mit solchen großen Werten erheblich langsamer sind. Denken Sie auch daran, dass jeder Index Kopien der Werte enthält, die indiziert werden, so dass ein erheblicher Speicherbedarf besteht. Dies wiederum bedeutet einen häufigeren Plattenzugriff, um virtuelle Speicherseiten innerhalb und außerhalb des Speichers auszutauschen, was sich wiederum negativ auf die Leistung auswirkt.
Also ja, begrenzt auf 800 Bytes.
Hash-Kollisionen sollten selten sein, wenn Sie eine gute Hash-Funktion mit einem ausreichend langen Hash-Wert verwenden. Wenn Ihr Hash beispielsweise einen 128-Bit-Wert ausgibt, erhalten Sie normalerweise eine Kollision, nachdem Sie 2 ^ 64 Hashes erzeugt haben. Wenn Sie also eine Million Hashes pro Sekunde erzeugen, erhalten Sie nach ungefähr 600.000 Jahren eine Kollision. Dies ist wahrscheinlich für die meisten Zwecke gut genug.