Estoy tratando de generar identificaciones únicas para usar en una aplicación de Google App Engine y me gustaría recibir comentarios sobre la viabilidad del enfoque que estoy pensando utilizar (preguntas al final). He leído bastantes preguntas sobre este tema, pero no recuerdo haber encontrado este enfoque en particular.minúscula generación de ID de aspecto aleatorio
Me gustaría obtener ID de aspecto aleatorio, por ejemplo, hashes MD5, pero también quiero que sean pequeños. De cuatro a seis caracteres, a lo largo de las líneas de tinyurl, sería ideal. Los ID serán para contenido generado por el usuario, en el contexto de mi aplicación, cosas como preguntas de prueba que las personas estarán escribiendo. No es necesario que los ID sean aleatorios (está bien si se parecen a los ID de serie), pero el enfoque que estoy pensando usar se presta a esto, por lo que no es realmente un problema.
Las personas familiarizadas con Google App Engine sabrán que las escrituras en el almacén de datos son particularmente caras y pueden provocar tiempos de espera excedidos si hay demasiadas para el mismo grupo de entidades. Los contadores de Sharded son un enfoque que a menudo se usa para evitar la contención de escritura en un único contador global y las transacciones fallidas que lo acompañan.
Además de obtener identificaciones cortas y evitar la contención de escritura, intento evitar la paradoja del cumpleaños. Me gustaría prepararme para la posibilidad de que haya millones de ID, incluso si esto va un poco por la borda.
Yo estaba pensando en usar un contador fragmentada a lo largo de las siguientes líneas:
- el contador está fragmentada en usuarios, por lo que hay un fragmento para cada usuario. Cada objeto contador tiene su propia cuenta que es específica para un usuario dado, que se incrementa cuando ese usuario crea un nuevo elemento. El recuento se incrementa independientemente de si un elemento se ha creado correctamente.
- La base de un documento de identidad es un hash MD5 de la siguiente cadena: "< fácil de dirección de correo electrónico > | < última contravalor >".
- El hash MD5 resultante se trunca, inicialmente a cuatro caracteres.
- Se mantiene un único valor global de "longitud". Siempre que los pasos anteriores den como resultado una clave duplicada (uno imagina que esto ocurrirá bastante rápido al principio), el valor de la longitud se incrementará en uno. Los valores hash MD5 para nuevos ID ahora se truncarán en caracteres "longitud", en lugar de cuatro caracteres.
- No quiero exponer la dirección de correo electrónico del usuario, lo que sugiere que un hash de algún tipo sería una buena forma de hacerlo.
Mis preguntas son: ¿Estoy en lo cierto al pensar que esto evitará la contención de escritura como resultado de claves duplicadas y que la contención de escritura en el campo de longitud probablemente no sea un problema, especialmente en longitudes más largas? ¿Alguien puede describir las matemáticas involucradas aquí? ¿La longitud aumentaría rápidamente a casi la longitud de un hash MD5, poniendo en duda el valor de todo el enfoque? ¿Sería mejor simplemente usar el hash completo (más largo) MD5 para mantener las cosas más fáciles de mantener? ¿Hay algo que estoy pasando por alto?
Gracias por el enfoque interesante. Lo pensaré un poco y trataré de entenderlo mejor. Una pregunta que tengo es cuánto será el resultado de las colisiones (o reintentos) a medida que el número de claves crece. Estoy tratando de mantener las colisiones lo más cerca posible del cero. –
Solo se producirán colisiones cuando las particiones se llenen. – Dave
Hay otras optimizaciones que puede hacer con esto: 1. Memcache una lista de "particiones rellenas" 2. Si va a obtener una serie de identificaciones a la vez, puede tomar un bloque de n ids de una partición y luego incrementar su contador por ese valor. – Dave