Necesita manejar> 1000 pero <10000 registros nuevos por día
No se pueden utilizar GUID / UUID, números de incremento automático, etc.
Idealmente debería tener 5 o 6 caracteres de largo, puede ser alfa por supuesto
Quisiera reutilizar algos existentes conocidos, si están disponibles
¿Algo ahí fuera?
Respuestas:
Tinyurl y bit.ly utilizan Base 62 para las URL abreviadas. Es un método bien conocido para crear ID "únicos" legibles por humanos. Por supuesto, tendrá que almacenar los ID creados y verificar si hay duplicados en la creación para garantizar la singularidad. (Vea el código al final de la respuesta)
Métricas de singularidad base 62
5 caracteres en la base 62 le darán 62 ^ 5 ID únicos = 916,132,832 (~ 1 mil millones) Con 10k ID por día, estará bien durante 91k + días
6 caracteres en la base 62 le darán 62 ^ 6 ID únicos = 56,800,235,584 (más de 56 mil millones) Con 10k ID por día, estará bien durante más de 5 millones de días
Métricas de singularidad base 36
6 caracteres le darán 36 ^ 6 ID únicos = 2,176,782,336 (2+ mil millones)
7 caracteres le darán 36 ^ 7 ID únicos = 78,364,164,096 (78+ mil millones)
Código:
public void TestRandomIdGenerator() { // create five IDs of six, base 62 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6)); // create five IDs of eight base 36 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8)); } public static class RandomIdGenerator { private static char[] _base62chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .ToCharArray(); private static Random _random = new Random(); public static string GetBase62(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(62)]); return sb.ToString(); } public static string GetBase36(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(36)]); return sb.ToString(); } }
Salida:
fuente
Recomiendo http://hashids.org/ que convierte cualquier número (por ejemplo, DB ID) en una cadena (usando salt).
Permite decodificar esta cadena de nuevo al número. Por lo que no es necesario almacenarlo en la base de datos.
Tiene libs para JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C ++ 11, Go, Erlang, Lua, Elixir, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript y para Node.js y .NET.
fuente
Tenía requisitos similares a los del OP. Busqué en las bibliotecas disponibles, pero la mayoría de ellas se basan en la aleatoriedad y no quería eso. Realmente no pude encontrar nada que no estuviera basado en aleatorio y aún muy corto ... Así que terminé rodando el mío basado en la técnica que usa Flickr , pero modificado para requerir menos coordinación y permitir períodos más largos sin conexión.
En breve:
Desventajas:
Ventajas
He publicado tanto una biblioteca Javascript para el lado del cliente como una implementación de servidor Java EE. La implementación de servidores en otros idiomas también debería ser fácil.
Aquí están los proyectos:
suid : ID únicos de servicio distribuidos que son breves y fáciles
suid-server-java : implementación de suid-server para la pila de tecnología Java EE.
Ambas bibliotecas están disponibles bajo una licencia liberal de código abierto Creative Commons. Esperando que esto pueda ayudar a otra persona a buscar identificaciones únicas breves.
fuente
suid
?Usé la base 36 cuando resolví este problema para una aplicación que estaba desarrollando hace un par de años. Necesitaba generar un número razonablemente único legible por humanos (dentro del año calendario actual de todos modos). Elegí usar el tiempo en milisegundos desde la medianoche del 1 de enero del año en curso (por lo que cada año, las marcas de tiempo podrían duplicarse) y convertirlo a un número base 36. Si el sistema que se estaba desarrollando se encontraba con un problema fatal, generaba el número base 36 (7 caracteres) que se mostraba a un usuario final a través de la interfaz web, quien luego podía transmitir el problema encontrado (y el número) a una persona de soporte técnico (que luego podría usarlo para encontrar el punto en los registros donde comenzó el seguimiento de la pila). Un número como 56af42g7es infinitamente más fácil de leer y transmitir para un usuario que una marca de tiempo como 2016-01-21T15: 34: 29.933-08: 00 o un UUID aleatorio como 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578 .
fuente
Realmente me gusta la simplicidad de simplemente codificar un GUID usando el formato Base64 y truncar el == final para obtener una cadena de 22 caracteres (se necesita una línea de código y siempre se puede convertir de nuevo a GUID). Lamentablemente, a veces incluye caracteres + y /. Está bien para la base de datos, no es genial para las URL, pero me ayudó a apreciar las otras respuestas :-)
Desde https://www.codeproject.com/Tips/1236704/Reducing-the-string-Length-of-a-Guid por Christiaan van Bergen
var newGuid = Guid.NewGuid(); var messageID = Convert.ToBase64String(newGuid.ToByteArray()); var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);
fuente