Criando seu próprio estilo Tinyurl

Eu estou escrevendo um pequeno artigo sobre alternativas humanamente legíveis para Guids / UIDs, por exemplo, aqueles usados ​​no TinyURL para os hashes de URL (que muitas vezes são impressos em revistas, por isso precisam ser curtos).

O uid simples que estou gerando é - 6 caracteres: uma letra minúscula (a-z) ou 0-9.

"Segundo o meu capitão de cálculos", são 6 eventos mutuamente exclusivos, embora calcular a probabilidade de um confronto seja um pouco mais difícil do que P (A ou B) = P (A) + P (B), como obviamente inclui números e o código abaixo, você pode ver se funciona para usar um número ou uma letra usando 50/50.

Estou interessado na taxa de colisão e se o código abaixo for uma simulação realista da taxa de colisão antecipada que você obteria gerando um hash. Em média, recebo 40-50 confrontos por milhão, mas, tendo em mente que o uid não seria gerado um milhão de vezes ao mesmo tempo, mas provavelmente apenas cerca de 10 a 1000 vezes por minuto.

Qual é a probabilidade de um choque a cada vez, e alguém pode sugerir uma maneira melhor de fazer isso?

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();
}

ATUALIZAR: Aqui está o artigo resultante desta pergunta

Eu realmente fiz duas perguntas aqui, então eu estava trapaceando. A resposta que eu buscava era a de rcar, no entanto a de Sklivvz também é a resposta para a segunda parte (uma alternativa). É possível criar um gerador de ID exclusivo personalizado em um banco de dados ou seria do lado do cliente (o que seria duas leituras possíveis primeiro)?

A idéia geral que eu buscava era usar IDs em bancos de dados ou outras lojas que pudessem ser usadas por telefone ou material impresso, e não por um guia gigante de 16 bytes.

ATUALIZAÇÃO 2: Eu coloquei a fórmula para dois eventos mutuamente exclusivos acima em vez de dois independentes (como obter um 'a' pela primeira vez não significa que você não pode obter um 'a' na segunda vez). Deveria ter sido P (A e B) = P (A) x P (B)

questionAnswers(8)

yourAnswerToTheQuestion