Моего коллеги и я обсуждаем, какие из этих методов использовать для автоматических генерирующего пользователя идентификаторов и пост ID для идентификации в базе данных:Guid.NewGuid() VS случайная строка генератор от Random.Next()
One опция использует один экземпляр Random и принимает некоторые полезные параметры, поэтому его можно повторно использовать для всех видов строковых (например, от 4-значных цифровых контактов до 20-значных буквенно-цифровых идентификаторов). Вот код:
// This is created once for the lifetime of the server instance
class RandomStringGenerator
{
public const string ALPHANUMERIC_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
public const string ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public const string NUMERIC = "1234567890";
Random rand = new Random();
public string GetRandomString(int length, params char[] chars)
{
string s = "";
for (int i = 0; i < length; i++)
s += chars[rand.Next() % chars.Length];
return s;
}
}
и другой вариант просто использовать:
Guid.NewGuid();
Мы оба понимаем, что Guid.NewGuid()
будет работать для наших нужд, но я предпочел бы используйте специальный метод. Он делает то же самое, но с большим контролем.
Мой коллега считает, что, поскольку пользовательский метод был приготовлен самим, он скорее сгенерирует столкновения. Я признаю, что не знаю о реализации Random, но я предполагаю, что он так же случайен, как Guid.NewGuid(). Типичное использование пользовательского метода может быть:
RandomStringGenerator stringGen = new RandomStringGenerator();
string id = stringGen.GetRandomString(20, RandomStringGenerator.ALPHANUMERIC_CAPS.ToCharArray());
Edit 1:
- Мы используем Azure таблицы, которые не имеют автоматическое приращение (или аналогичный) функцию для генерации ключей.
- Некоторые ответы здесь просто говорят мне использовать NewGuid(), потому что это то, для чего это сделано ». Я ищу более глубокую причину того, почему метод варки может с большей вероятностью генерировать столкновения, учитывая те же степени свободы, что и Guid.
Edit 2:
Мы также использовали приготовленную вверх метод для генерации идентификатора поста, который, в отличие от сессионных токенов, нужно, чтобы выглядеть красиво для отображения в URL нашего сайта (как http://mywebsite.com/14983336), поэтому здесь нет выбора, но коллизий все равно следует избегать.
'Random' делает * НЕТ * гарантия уникальности. Совершенно верно, что случайная последовательность содержит один и тот же результат несколько раз. – GalacticCowboy
Если вы готовите его самостоятельно, он вряд ли будет ** UNIQUE **, а затем GUID. GUID использует определенные аппаратные факторы и текущее время для генерации определенного GUID. Вы можете самостоятельно исследовать детали. GUID не будет уникальным, если вы слишком часто удаляете один и тот же GUID-генератор за короткий промежуток времени. Опять же, вы можете сами посмотреть детали. – StarPilot
Если вы хотите генерировать уникальные идентификаторы пользователей и почтовые идентификаторы, вам следует использовать автоматически увеличивающиеся числа из базы данных. Удалите базу данных, верните следующий номер в этой последовательности. Гарантировано уникальное. – StarPilot