Tengo un sistema que requiere un código único de 6 dígitos para representar un objeto, y estoy tratando de pensar en un buen algoritmo para generarlos. Éstos son el pre-reqs:Código único tipo Tinyurl: algoritmo potencial para evitar colisiones
- estoy usando un sistema de base-20 (sin tapas, números, vocales, o l para evitar confusión y malas palabras)
- La base-20 permite 64 millones de combinaciones
- Insertaré potencialmente de 5 a 10 mil entradas a la vez, así que en teoría usaría inserciones en bloque, lo que significa que usar una clave única probablemente no sea eficiente o bonito (especialmente si hay comienza a haber muchas colisiones)
- No está fuera de qu estion para llenar el 10% de las combinaciones por lo que hay un gran potencial para una gran cantidad de colisiones
- quiero para asegurarse de que los códigos son no consecutivas
tuve una idea que parecía que iba a funcionar, pero No soy lo suficientemente bueno en matemáticas para descubrir cómo implementarlo: si comienzo en 0 e incremento en N, luego paso a base-20, parece que debería haber algún valor para N que me permita contar cada valor de 0-63,999,999 antes de repetir cualquiera.
Por ejemplo, al pasar de 0 a 9 usando N = 3 (modo 10 mod 3): 0, 3, 6, 9, 2, 5, 8, 1, 4, 7.
¿Hay alguna ¿Método matemático mágico para calcular los valores de N para un número mayor que puede contar a través de todo el rango sin repetir? Idealmente, el número que elija saltaría de un lado a otro del conjunto de modo que no fuera obvio que hubiera un patrón, pero no estoy seguro de qué tan posible sea.
Alternativamente, un algoritmo hash que garantice la unicidad para valores de 0-64 millones funcionaría, pero soy demasiado tonto como para saber si eso es posible.
Números primos ... Creo que realmente soy malo en matemáticas; parece obvio en hindsite. Gracias a todos los que contestaron. Le di crédito a phantombrain por responder primero. –
Dado que mencionas tinyurl, mi respuesta a esta pregunta podría ser aplicable: http://stackoverflow.com/questions/1051949/map-incrementing-integer-range-to-six-digit-base-26-max-but-unpredictably/1052896 # 1052896 – FogleBird
No olvide doblar los códigos para que no sean consecutivos. – Beta