Estoy escribiendo un pequeño artículo sobre alternativas legibles para las personas a los Guids/UID, por ejemplo los utilizados en TinyURL para los hashes de url (que a menudo se imprimen en revistas, por lo que deben ser cortos).Creando su propio uid de estilo Tinyurl
El uid simple que estoy generando es de 6 caracteres: una letra minúscula (a-z) o 0-9.
"De acuerdo con mis cálculos capitán", son 6 eventos mutuamente excluyentes, aunque calcular la probabilidad de un choque es un poco más difícil que P (A o B) = P (A) + P (B), obviamente incluye números y del código a continuación, puede ver que funciona si usar un número o letra usando 50/50.
Me interesa la tasa de choque y si el siguiente código es una simulación realista de la tasa de choque anticipada que obtendrías al generar un hash. En promedio, recibo 40-50 choques por millón, sin embargo, teniendo en cuenta que el uid no se generaría un millón de veces a la vez, sino probablemente solo entre 10 y 1000 veces por minuto.
¿Cuál es la probabilidad de un choque cada vez, y alguien puede sugerir una mejor manera de hacerlo?
static Random _random = new Random();
public static void main()
{
// Size of the key, 6
HashSet<string> set = new HashSet<string>();
int clashes = 0;
for (int n=0;n < 1000000;n++)
{
StringBuilder builder = new StringBuilder();
for (int i =0;i < 7;i++)
{
if (_random.NextDouble() > 0.5)
{
builder.Append((char)_random.Next(97,123));
}
else
{
builder.Append(_random.Next(0,9).ToString());
}
}
if (set.Contains(builder.ToString()))
{
clashes++;
Console.WriteLine("clash: (" +n+ ")" +builder.ToString());
}
set.Add(builder.ToString());
_random.Next();
//Console.Write(builder.ToString());
}
Console.WriteLine("Clashes: " +clashes);
Console.ReadLine();
}
ACTUALIZACIÓN: Here's the resulting article de esta pregunta
Realmente hizo dos preguntas aquí, así que estaba haciendo trampa. La respuesta que estaba buscando era la de Rcar, sin embargo, Sklivvz también es la respuesta a la segunda parte (una alternativa). ¿Es posible crear un generador de ID único personalizado en una base de datos, o sería del lado del cliente (lo que serían 2 posibles lecturas primero)?
La idea general que perseguía era usar Ids en bases de datos u otras tiendas que se pueden usar por teléfono o material impreso, no como un guiado gigante de 16 bytes.
ACTUALIZACIÓN 2: Puse la fórmula para dos eventos mutuamente excluyentes arriba en lugar de 2 independientes (ya que obtener una 'a' la primera vez no significa que no puede obtener una 'a' la segunda vez) Debería haber sido P (A y B) = P (A) x P (B)
Mala idea para hash la ID: necesita recuperar la ID sin hit para buscar la fila. Ver la respuesta de Sklivvz. – MSalters
No creo que tus matemáticas sean correctas. Los datos del OP sugieren ~ 50 colisiones por millón, mientras que usted predice 1700 (0.17% de 1000000). Tal vez me estoy perdiendo algo? – freespace
No quise decir un hash real; Solo quería seguir la respuesta de Sklivvz. Editaré mi respuesta para aclarar eso. – Randy