Tworzenie własnego Uid w stylu Tinyurl

Piszę mały artykuł na temat czytelnych dla człowieka alternatyw dla Guidów / UID, na przykład tych używanych na TinyURL dla skrótów URL (które są często drukowane w czasopismach, więc muszą być krótkie).

Prosty uid, który generuję, to - 6 znaków: albo mała litera (a-z) albo 0-9.

„Według moich obliczeń kapitan”, to jest 6 wzajemnie wykluczających się zdarzeń, chociaż obliczenie prawdopodobieństwa konfliktu staje się nieco trudniejsze niż P (A lub B) = P (A) + P (B), ponieważ oczywiście obejmuje ono liczby i od poniższy kod, widać, że sprawdza, czy użyć liczby lub litery przy użyciu 50/50.

Interesuje mnie współczynnik kolizji i jeśli poniższy kod jest realistyczną symulacją przewidywanego współczynnika kolizji, który można uzyskać po wygenerowaniu skrótu. Średnio dostaję 40-50 starć na milion, choć nie mam pojęcia, że ​​uid nie zostanie wygenerowany milion razy na raz, ale prawdopodobnie tylko około 10-1000 razy na minutę.

Jakie jest prawdopodobieństwo konfliktu za każdym razem i czy ktoś może zaproponować lepszy sposób na to?

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

AKTUALIZACJA: Oto wynikowy artykuł z tego pytania

Naprawdę zadałem tutaj dwa pytania, więc oszukiwałem. Odpowiedzią, na którą byłem, była rcar, jednak Sklivvz jest także odpowiedzią na drugą część (alternatywa). Czy możliwe jest utworzenie własnego unikalnego generatora id w bazie danych, czy też może to być strona klienta (co byłoby pierwszym możliwym odczytem)?

Ogólny pomysł, jakim się kierowałem, polegał na używaniu identyfikatorów w bazach danych lub innych sklepach, które mogą być używane przez telefon lub materiały drukowane, a nie gigantyczną 16-bajtową przewodnik.

AKTUALIZACJA 2: Podałem wzór na dwa wzajemnie wykluczające się zdarzenia powyżej 2 niezależnych (ponieważ uzyskanie „a” po raz pierwszy nie oznacza, że ​​nie można uzyskać „a” po raz drugi). Powinno być P (A i B) = P (A) x P (B)

questionAnswers(8)

yourAnswerToTheQuestion