Как создать уникальный номер из 8 цифр?
Я использую этот код для создания 8-значного уникального номера.
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToUInt32(buffer, 8).ToString();
Действительно ли этот код генерирует уникальный номер или он может снова повторить то же число?
Ответы
Ответ 1
GUID - это не просто случайное число; он состоит из сегментов. Некоторые из сегментов не изменятся вообще, если guid генерируется на том же компьютере. Используя только 64-битные исходные 128 бит, вы нарушаете структуру guid и, скорее всего, нарушаете уникальность сгенерированного числа.
В этом вопросе есть дополнительная информация об уникальности указателей, проверьте эту ссылку а также для получения дополнительной информации о том, почему плохо использовать только часть руководства, если вам нужен уникальный номер.
Если вам необходимо ограничить дублирование до абсолютного минимума, инкрементный счетчик даст вам то, что вам нужно. Если ваше приложение использует несколько потоков или процессов, счетчик может быть жестким (или даже невозможным) для правильной реализации.
Это область, в которой были созданы контуры, чтобы быть уникальными на разных машинах. Поэтому, если уникальность между машинами - это требование, вы должны использовать подсказки. Все руководство.
Ответ 2
Любая случайная последовательность связана с некоторыми столкновениями. Это просто вопрос того, когда. Используя формулу парадоксального дня рождения, с 100 000 000 возможных значений (8 цифр), вероятность того, что у вас будет столкновение всего с 10 000 элементов, составляет около 40% и 99% с 30 000 элементов. (см. здесь для калькулятора).
Если вам действительно нужна случайная последовательность, вы не должны использовать GUID для этой цели. GUID имеют очень специфическую структуру и должны приниматься только в целом. Легко создать случайный 8-разрядный генератор последовательности. Это должно дать вам 8-значную последовательность:
public string Get8Digits()
{
var bytes = new byte[4];
var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
uint random = BitConverter.ToUInt32(bytes, 0) % 100000000;
return String.Format("{0:D8}", random);
}
Вы также можете взять RandomNumberGenerator и поместить его где-нибудь, чтобы избежать создания нового каждый раз.
Ответ 3
Мой первый ответ не касался проблемы уникальности. Мой второй:
static int counter;
public static int GetUniqueNumber()
{
return counter++;
}
Если вы хотите иметь уникальные номера для перезапуска приложений, вам нужно сохранить значение счетчика в базе данных или где-то еще после каждого вызова GetUniqueNumber.
Ответ 4
Вот еще одна версия
public static string GetFormNumber()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
var FormNumber = BitConverter.ToUInt32(buffer, 0) ^ BitConverter.ToUInt32(buffer, 4) ^ BitConverter.ToUInt32(buffer, 8) ^ BitConverter.ToUInt32(buffer, 12);
return FormNumber.ToString("X");
}
он гарантирует уникальность!
Ответ 5
Диапазон значений слишком мал. Инкрементный счетчик - лучшее решение, например, в системе ERP - вы устанавливаете первый номер клиента 1000, а следующий - 1001, 1002,..., 99999999. В противном случае, если вы получите от них случайное число (или часть GUID), вы снова получите тот же номер. В зависимости от вашего приложения, рано или поздно, но оно гарантировано произойдет раньше, чем просто повторить их.
Ответ 6
Если вам нужен уникальный номер между 10000000 и 99999999, запустите целое число от 10000000 и просто начните его увеличивать. Генерация последовательно упорядоченных номеров не менее случайна, чем любая другая сгенерированная последовательность, и намного проще сгенерировать.
Ответ 7
Этот метод генерирует случайную строку, он не полагается на метод Random, а также намного лучше, чем guid guidch:
public static string gen_Digits(int length)
{
var rndDigits = new System.Text.StringBuilder().Insert(0, "0123456789", length).ToString().ToCharArray();
return string.Join("", rndDigits.OrderBy(o => Guid.NewGuid()).Take(length));
}
вы можете увеличить длину для меньшего шанса столкновения, но чтобы иметь 100% уникальную последовательность, вам нужно сохранить старые сгенерированные значения и проверить вновь созданное значение для uniquness.
Ответ 8
Если вы выражаете no как комбинацию дня (2digit), hour (2digit), minute (2digit), второго (2digit) и year (4 цифры), тогда это будет 12-значный, но всегда уникальный номер
DateTime _now = DateTime.Now;
string _dd = _now.ToString("dd"); //
string _mm = _now.ToString("MM");
string _yy = _now.ToString("yyyy");
string _hh = _now.Hour.ToString();
string _min = _now.Minute.ToString();
string _ss = _now.Second.ToString();
string _uniqueId= _dd+ _hh+ _mm+_min+_ss + _yy;