i mitt fall kommer de flesta ID att genereras inom ett stort antal mobila klienter, inte inom en begränsad uppsättning servrar. Jag undrar om det i det här fallet finns en berättigad oro.
Det låter som väldigt dålig arkitektur för mig. Använder du en tvåskiktsarkitektur? Varför skulle de mobila klienterna ha direktåtkomst till db? Vill du verkligen lita på nätverksbaserad säkerhet?
Hur som helst, några överväganden om kollisionssannolikheten:
Varken UUID eller ObjectId förlitar sig på sin rena storlek, dvs båda är inte slumptal, men de följer ett schema som försöker att systematiskt minska kollisionssannolikheten. När det gäller ObjectIds är deras struktur:
- 4 byte sekunder sedan unix-epoken
- 3-byte maskin-id
- 2-byte process-id
- 3-byte-räknare
Detta betyder att, i motsats till UUID, är ObjectIds monotona (förutom inom en enda sekund), vilket förmodligen är deras viktigaste egenskap. Monotona index kommer att göra att B-trädet fylls mer effektivt, det tillåter sökning efter id och tillåter en 'standardsortering' efter id för att göra dina markörer stabila, och naturligtvis har de en tidsstämpel som är lätt att extrahera. Det här är de optimeringar du bör vara medveten om, och de kan vara enorma.
Som du kan se av strukturen för de andra 3 komponenterna blir kollisioner mycket sannolikt om du gör> 1k inserts/s på en enda process (inte riktigt möjligt, inte ens från en server), eller om antalet maskiner växer förbi cirka 10 (se födelsedagsproblem), eller om antalet processer på en enda maskin blir för stort (så igen, det är inte slumptal, men de är verkligen unika på en dator, men de måste förkortas till två byte ).
Naturligtvis, för att en kollision ska inträffa måste de matcha alla dessa aspekter, så även om två maskiner har samma maskinhash, skulle det fortfarande kräva att en klient infogar med samma räknarvärde i exakt samma sekund och samma process-id, men ja, dessa värden kan kollidera.