Я хотел бы сгенерировать случайные уникальные строки, подобные тем, которые генерируются библиотекой MSDN (например, объект ошибки ). Должна быть сгенерирована строка типа "t9zk6eay".
98
Я хотел бы сгенерировать случайные уникальные строки, подобные тем, которые генерируются библиотекой MSDN (например, объект ошибки ). Должна быть сгенерирована строка типа "t9zk6eay".
string randoms = Guid.NewGuid().ToString().Replace("-", string.Empty).Replace("+", string.Empty).Substring(0, 4);
больше можно найти здесьОтветы:
Использование Guid было бы неплохим способом, но чтобы получить что-то похожее на ваш пример, вы, вероятно, захотите преобразовать его в строку Base64:
Я избавляюсь от «=» и «+», чтобы немного приблизиться к вашему примеру, иначе вы получите «==» в конце строки и «+» в середине. Вот пример выходной строки:
"OZVV5TpP4U6wJthaCORZEQ"
источник
Convert.ToBase64String
идет речь, загляните сюда .new Guid()
без "взлома" (подделки часов или внутренних структур данных Windows). Не стесняйтесь использовать столько ядер, потоков, примитивов синхронизации и т. Д., Сколько захотите.Обновление 2016/1/23
Если вы найдете этот ответ полезным, вас может заинтересовать опубликованная мною простая библиотека генерации паролей (~ 500 SLOC) :
Затем вы можете генерировать случайные строки, как в ответе ниже:
Одним из преимуществ библиотеки является то, что код лучше разложен, поэтому вы можете использовать безопасную случайность не только для генерации строк . Посетите сайт проекта для получения более подробной информации.
Оригинальный ответ
Поскольку никто еще не предоставил безопасный код, я публикую следующее на тот случай, если кто-то сочтет это полезным.
Спасибо Ахмаду за то, что он указал, как заставить код работать в .NET Core.
источник
.netcore
: Заменитьvar rng = new RNGCryptoServiceProvider()
наvar rng = RandomNumberGenerator.Create()
Я бы предупредил, что идентификаторы GUID не случайные числа . Их не следует использовать в качестве основы для генерации чего-либо, что, как вы ожидаете, будет абсолютно случайным (см. Http://en.wikipedia.org/wiki/Globally_Unique_Identifier ):
Вместо этого просто используйте метод C # Random. Что-то вроде этого ( код здесь ):
GUID подходят, если вам что-то нужно уникальное (например, уникальное имя файла или ключ в базе данных), но они не подходят для чего-то, что вы хотите быть случайным (например, пароля или ключа шифрования). Так что это зависит от вашего приложения.
редактировать . Microsoft говорит, что Random тоже не так хорош ( http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx ):
источник
Я упростил решение @Michael Kropats и сделал версию в стиле LINQ.
источник
Я не думаю, что они действительно случайны, но предполагаю, что это какие-то хеши.
Когда мне нужен какой-то случайный идентификатор, я обычно использую GUID и конвертирую его в "голое" представление:
источник
Попробуйте комбинацию Guid и Time.Ticks
источник
Я удивлен, почему нет решения CrytpoGraphic. GUID уникален, но не является криптографически безопасным . См. Эту скрипку Dotnet.
Если вы хотите подготовить Guid:
Более чистая буквенно-цифровая строка:
источник
Решение Майкла Кропаца в VB.net
источник
Это работает идеально для меня
источник
Это было запрошено для разных языков. Вот один вопрос о паролях, которые также должны быть применимы здесь.
Если вы хотите использовать строки для сокращения URL-адресов, вам также понадобится Dictionary <> или проверка базы данных, чтобы узнать, был ли уже использован сгенерированный идентификатор.
источник
Если вам нужны буквенно-цифровые строки со строчными буквами и символами верхнего регистра ([a-zA-Z0-9]), вы можете использовать Convert.ToBase64String () для быстрого и простого решения.
Что касается уникальности, проверьте задачу дня рождения, чтобы вычислить, насколько вероятно возникновение столкновения (A) длина сгенерированных строк и (B) количество сгенерированных строк.
источник
источник
Получить уникальный ключ с помощью хеш-кода GUID
источник