Chciałbym generować losowe, unikalne ciągi, takie jak te generowane przez bibliotekę MSDN ( na przykład obiekt błędu ). Powinien zostać wygenerowany ciąg typu „t9zk6eay”.
98
Chciałbym generować losowe, unikalne ciągi, takie jak te generowane przez bibliotekę MSDN ( na przykład obiekt błędu ). Powinien zostać wygenerowany ciąg typu „t9zk6eay”.
string randoms = Guid.NewGuid().ToString().Replace("-", string.Empty).Replace("+", string.Empty).Substring(0, 4);
więcej można znaleźć tutajOdpowiedzi:
Używanie Guid byłoby całkiem dobrym sposobem, ale aby uzyskać coś podobnego do twojego przykładu, prawdopodobnie chcesz przekonwertować go na ciąg Base64:
Pozbywam się „=” i „+”, aby zbliżyć się trochę do twojego przykładu, w przeciwnym razie otrzymasz „==” na końcu ciągu i „+” w środku. Oto przykładowy ciąg wyjściowy:
„OZVV5TpP4U6wJthaCORZEQ”
źródło
Convert.ToBase64String
chodzi, zajrzyj tutaj .new Guid()
bez „hakowania” (manipulowania zegarem lub wewnętrznymi strukturami danych systemu Windows). Możesz swobodnie używać dowolnej liczby rdzeni, wątków, elementów podstawowych synchronizacji itp.Aktualizacja 2016/1/23
Jeśli uznasz tę odpowiedź za przydatną, możesz być zainteresowany prostą (~ 500 SLOC) biblioteką generowania haseł, którą opublikowałem :
Następnie możesz wygenerować losowe ciągi, tak jak w odpowiedzi poniżej:
Jedną z zalet biblioteki jest to, że kod jest lepiej rozłożony na czynniki, dzięki czemu można używać bezpiecznej losowości nie tylko do generowania ciągów . Sprawdź na stronie projektu o więcej szczegółów.
Oryginalna odpowiedź
Ponieważ nikt jeszcze nie podał bezpiecznego kodu, zamieszczam następujący kod na wypadek, gdyby ktoś uznał go za przydatny.
Dziękuję Ahmadowi za wskazanie, jak uzyskać kod działający na .NET Core.
źródło
.netcore
: Wymieńvar rng = new RNGCryptoServiceProvider()
zvar rng = RandomNumberGenerator.Create()
Ostrzegam, że identyfikatory GUID nie są liczbami losowymi . Nie powinny być używane jako podstawa do generowania niczego, co według Ciebie będzie całkowicie losowe (patrz http://en.wikipedia.org/wiki/Globally_Unique_Identifier ):
Zamiast tego po prostu użyj metody C # Random. Coś takiego ( kod znaleziony tutaj ):
Identyfikatory GUID są dobre, jeśli chcesz czegoś unikalnego (na przykład unikatowej nazwy pliku lub klucza w bazie danych), ale nie nadają się do czegoś, co chcesz, aby były losowe (jak hasło lub klucz szyfrowania). Więc to zależy od twojej aplikacji.
Edytuj . Microsoft twierdzi, że Random też nie jest taki wspaniały ( http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx ):
źródło
Uprościłem rozwiązanie @Michael Kropats i stworzyłem wersję LINQ-esque.
źródło
Nie sądzę, że są one naprawdę przypadkowe, ale przypuszczam, że to kilka skrótów.
Zawsze, gdy potrzebuję jakiegoś losowego identyfikatora, zwykle używam identyfikatora GUID i konwertuję go na jego „nagą” reprezentację:
źródło
Wypróbuj kombinację Guid i Time.Ticks
źródło
Dziwię się, dlaczego nie ma rozwiązania CrytpoGraphic. Identyfikator GUID jest unikalny, ale nie jest bezpieczny kryptograficznie . Zobacz to Dotnet Fiddle.
W przypadku, gdy chcesz dołączyć na początku Guid:
Czystszy ciąg alfanumeryczny:
źródło
Rozwiązanie Michaela Kropatsa w VB.net
źródło
To działa idealnie dla mnie
źródło
O to pytano w różnych językach. Oto jedno pytanie dotyczące haseł, które również powinny mieć zastosowanie.
Jeśli chcesz użyć ciągów do skracania adresów URL, będziesz również potrzebować Dictionary <> lub sprawdzenia bazy danych, aby zobaczyć, czy wygenerowany identyfikator nie został już użyty.
źródło
Jeśli potrzebujesz ciągów alfanumerycznych z małymi i dużymi literami ([a-zA-Z0-9]), możesz użyć Convert.ToBase64String (), aby uzyskać szybkie i proste rozwiązanie.
Jeśli chodzi o unikalność, sprawdź problem z datą urodzenia, aby obliczyć prawdopodobieństwo kolizji (A) długość wygenerowanych ciągów i (B) liczba wygenerowanych ciągów.
źródło
źródło
Uzyskaj unikalny klucz za pomocą kodu skrótu GUID
źródło