Generowanie unikalnego * i * losowego adresu URL w C #

Moim głównym celem jest stworzenie unikalnego adresu URL, którego nie można odgadnąć / przewidzieć. Celem tego adresu URL jest umożliwienie użytkownikom wykonywania operacji takich jak weryfikacja adresu e-mail i resetowanie hasła. Te adresy URL wygasną w określonym czasie (obecnie ustawionym na 24 godziny).

Początkowo korzystałem zGuid do tego celu, ale teraz rozumiem, że jest gdzieś pomiędzy „po prostu dobrze” i „bardzo niepewnie”, w zależności od tego, jakiego eksperta słuchasz. Pomyślałem, że trochę wzmocnię mój kod, na wszelki wypadek. Na początku myślałem, że będę się trzymałGuid, ale generuj go z losowych bajtów, a nie zGuid.NewGuid() metoda fabryczna. Oto metoda, którą wymyśliłem:

public static Guid GetRandomGuid()
{
    var bytes = new byte[16];
    var generator = new RNGCryptoServiceProvider();
    generator.GetBytes(bytes);
    return new Guid(bytes);
}

Nie wiem dokładnie, co dokładnie się dzieje, gdy używasznew Guid(bytes) zamiastGuid.NewGuid(), ale myślę, że cała ta metoda to generowanie losowej tablicy bajtów isklep to wGuid struktura danych. Innymi słowy, nie jest już gwarantowane, że będzie wyjątkowy, tylko że będzie losowy.

Ponieważ moje adresy URL muszą być unikalnei losowo, nie wydaje się to solidnym rozwiązaniem. Teraz myślę, że moje adresy powinny opierać się na kombinacji obu unikalnych identyfikatorów (które mogą byćGuid lub, jeśli jest dostępny, automatycznie zwiększany identyfikator bazy danych) i losową sekwencję wygenerowaną zRNGCryptoServiceProvider.

pytania

Jaki jest najlepszy sposób na wygenerowanie adresu URL weryfikacji / resetowania hasła, który jest gwarantowany zarówno jako unikalny, jak i niezwykle trudny / niemożliwy do przewidzenia / zgadnięcia?

Czy powinienem po prostu skonstruować mój adres URL, łącząc unikalny ciąg z losowym ciągiem?

Czy .NET Framework ma wbudowany sposób łatwego generowania unikalnegoi losowa (nieprzewidywalna) sekwencja, która może być użyta dla adresów URL?

Jeśli nie, czy jest dostępne dobre rozwiązanie open source?

Aktualizacja

W przypadku, gdy ktoś ma podobne wymagania, używam obecnie następującej metody:

public static string GenerateUniqueRandomToken(int uniqueId)
    // generates a unique, random, and alphanumeric token
{
    const string availableChars =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    using (var generator = new RNGCryptoServiceProvider())
    {
        var bytes = new byte[16];
        generator.GetBytes(bytes);
        var chars = bytes
            .Select(b => availableChars[b % availableChars.Length]);
        var token = new string(chars.ToArray());
        return uniqueId + token;
    }
}

Proszę o komentarz, jeśli widzisz jakieś problemy.

questionAnswers(5)

yourAnswerToTheQuestion