Sto provando a generare ID univoci da utilizzare in un'applicazione di Google App Engine e vorrei ricevere un feedback sulla fattibilità dell'approccio che sto pensando di utilizzare (domande alla fine). Ho letto alcune domande su questo argomento, ma non ricordo di aver incontrato questo particolare approccio.minuscola generazione ID dall'aspetto casuale
Mi piacerebbe avere ID a caso, ad esempio hash MD5, ma voglio anche che siano piccoli. Sarebbero ideali da quattro a sei caratteri, sulla falsariga di tinyurl. Gli ID saranno per i contenuti generati dagli utenti, nel contesto della mia applicazione, cose come le domande di prova che le persone scriveranno. Non è necessario che gli ID siano casuali (va bene se sembrano ID seriali), ma l'approccio che sto pensando di usare si presta a questo, quindi non è davvero un problema.
Le persone che hanno familiarità con Google App Engine sapranno che le scritture sull'archivio dati sono particolarmente costose e possono causare timeout se ce ne sono troppe per lo stesso gruppo di entità. I contatori Sharded sono un approccio che viene spesso utilizzato per evitare conflitti di scrittura su un singolo contatore globale e le transazioni fallite che lo accompagnano.
Oltre a ottenere ID brevi ed evitare conflitti di scrittura, sto cercando di evitare il paradosso del compleanno. Mi piacerebbe preparare la possibilità che ci siano milioni di ID, anche se questo sta andando fuori bordo un po '.
Stavo pensando di utilizzare un contatore sharded secondo le seguenti linee:
- il contatore è sharded sugli utenti, in modo che ci sia un frammento per ciascun utente. Ogni oggetto contatore ha il proprio conteggio specifico per un determinato utente, che viene incrementato quando un nuovo elemento viene creato da tale utente. Il conteggio viene incrementato indipendentemente dal fatto che un articolo sia stato creato correttamente.
- La base di un ID è un hash MD5 della seguente stringa: "< indirizzo e-mail utente > | < ultimo contatore-valore >".
- L'hash MD5 risultante viene quindi troncato, inizialmente a quattro caratteri.
- Viene mantenuto un singolo valore "lunghezza" globale. Ogni volta che i passaggi precedenti danno come risultato una chiave duplicata (uno immagina che questo accada abbastanza rapidamente all'inizio), il valore della lunghezza sarà aumentato di uno. Gli hash MD5 per i nuovi ID ora verranno troncati a caratteri "length" anziché a quattro caratteri.
- Non voglio esporre l'indirizzo email dell'utente, il che suggerisce che un hash di qualche tipo sarebbe un buon modo per andare.
Le mie domande sono: Ho ragione di pensare che questo sarà in gran parte evitare conflitti di scrittura a seguito di chiavi duplicate e tale affermazione di scrittura sul campo di lunghezza probabilmente non essere un problema, soprattutto in lunghezze superiori? Qualcuno può descrivere la matematica coinvolta qui? La lunghezza aumenterebbe rapidamente fino a raggiungere la lunghezza di un hash MD5, mettendo in discussione il valore dell'intero approccio? Sarebbe meglio andare semplicemente con l'hash MD5 completo (più lungo) per mantenere le cose più facili da mantenere? C'è qualcosa che sto trascurando?
Grazie per l'approccio interessante. Ci penserò su e cercherò di capirlo meglio. Una domanda che ho è quanto costa quanto potrebbe causare collisioni (o tentativi) in quanto il numero di chiavi aumenta. Sto cercando di mantenere le collisioni il più vicino possibile allo zero. –
Si eseguono solo collisioni quando le partizioni si riempiono. – Dave
Ci sono altre ottimizzazioni che puoi fare con questo: 1. Memcache un elenco di "partizioni piene" 2. Se hai intenzione di ottenere un gruppo di id contemporaneamente, puoi prendere un blocco di id da un partizione e quindi incrementare il suo contatore con quel valore. – Dave