Странное поведение уникального идентификатора во внешнем источнике данных (1С, SQL Server)

Что такое UUID?

  • Генерируется определенной машиной алгоритма

Чтобы гарантировать уникальность UUID, спецификация определяет элементы, включая MAC-адрес сетевой карты, временную метку, пространство имен (Namespace), случайное или псевдослучайное число, время и другие элементы, а также алгоритм для генерации UUID из этих элементов. Сложные характеристики UUID означают, что он может быть сгенерирован только компьютером, обеспечивая его уникальность.

  • Обозначение без ручного управления, идентификация без ручного управления

UUID нельзя указать вручную, если вы не рискуете дублировать UUID. Сложность UUID определяет, что «нормальные люди» не могут напрямую знать, какой объект связан с UUID.

  • Возможность повторения в определенном диапазоне крайне мала.

Универсальный уникальный идентификатор (UUID) сВосемь классиковизRFC спецификация, Является 128-битным числом, также может быть выражено 32 шестнадцатеричными символами, разделенными знаком «-» посередине.

GUID (глобальный уникальный идентификатор) – это псевдоним UUID; но в практических приложениях GUID обычно относится к UUID, реализованному Microsoft.

Поскольку метка времени имеет полные 60 бит, вы можете потратить ее столько, сколько захотите, со 100 наносекундами как 1, считая с 15 октября 1582 года (может длиться 3655 лет, действительно сжечь больше цифр, 1582 интересно)

Идентификатор узла также имеет 48 битов, обычно выражаемых MAC-адресом, если есть несколько сетевых карт, просто используйте одну. Если у вас нет сетевой карты, используйте случайные числа, чтобы составить числа, или возьмите кучу другой информации, например имена хостов, и хешируйте их вместе.

16-битный порядковый номер используется только во избежание предыдущего изменения метки узла (например, смены сетевой карты), проблем с системой часов (например, замедления часов после перезапуска), пусть он будет случайным, чтобы избежать дублирования.

Но похоже, что в версии 1 не учитывалась ни проблема двух процессов на одной машине, ни параллелизм одной и той же временной метки, поэтому строгая версия 1 не была реализована, поэтому давайте рассмотрим каждый вариант.

Вариант Version1-Hibernate

Спящий режимCustomVersionOneStrategy.java, Что решает две проблемы версии 1 до

Стоит отметить, что 64-битный Long, состоящий из машинного процесса и идентификатора процесса, почти не изменился, и достаточно другого Long.

Вариант версии 1-MongoDB

MongoDBObjectId.java

-Timestamp (4 байта, 32 бита): находится на втором уровне и может длиться 136 лет с 1970 года.

-Последовательность инкремента (3 байта 24 бита, максимум 16 миллионов): это Int, который начинается со случайного числа (свидетель) и непрерывно увеличивается на единицу, и не существует такой вещи, как отметка времени, которая вернется к нулю через одну секунду. . Поскольку имеется только 3 байта, 4 байта Int необходимо усечь на 3 байта.

-Machine ID (3 байта 24 бит): соедините Mac-адреса всех сетевых карт вместе, чтобы получить HashCode, и тот же int должен быть усечен, а затем 3 байта. Если вы не можете получить сетевую карту, используйте случайное число, чтобы смешать ее.

-Process ID (2 байта 16 бит): получить номер процесса из JMX. Если вы его не получили, используйте хэш или случайное число имени процесса, чтобы смешать его.

Видно, что дизайн каждого поля MongoDB немного разумнее, чем Hibernate, например, временная метка находится на втором уровне. Общая длина также была уменьшена до 12 байтов 96 бит, но если вы используете 64 бит Long для сохраненияНе могу встать, Может быть выражено только как массив байтов или шестнадцатеричная строка.

Вдобавок, похоже, есть ошибка в последовательности автоматического увеличения для Java-версии драйвера.

Диспетчер снежинок Twitter

Snowflake также является диспетчером, сервисом на основе Thrift, но вместо простого самоприращения с помощью redis он похож на UUID версии 1.

Есть только одна длинная 64-битная длина, поэтомуIdWorkerРаспределены по:

Можно видеть, что, поскольку это диспетчер чисел, идентификатор машины и идентификатор процесса опускаются, поэтому он может быть выражен только одним Long.

Кроме того, для диспетчера этого типа клиент может иметь только один идентификатор за раз и не может быть получен пакетами, поэтому дополнительная задержка является проблемой.

  • Объект типа отображения. Например, кодовая таблица только с кодами и названиями.
  • Обслуживаемые вручную несистемные объекты. Например, некоторые основные данные в системе.
  • Java UUID Generator (JUG): генератор UUID с открытым исходным кодом, протокол LGPL, поддержка MAC-адресов.
  • UUID: Специальная лицензия с исходным кодом.
  • Встроенный генератор UUID в Java 5 и выше: кажется, что можно сгенерировать только UUID версии 3/4.

Кроме того, в Hibernate есть также генератор UUID, но это не UUID какой-либо (стандартной) версии, и это настоятельно не рекомендуется.

Собраны некоторые методы генерации UUID, организованные следующим образом

  • В большинстве сред Unix / Linux есть небольшой инструмент под названием uuidgen, который может генерировать UUID для стандартного вывода, запустив
  • Прочитать файл/proc/sys/kernel/random/uuidПолучите UUID, например:

cat /proc/sys/kernel/random/uuid

libuuid – это библиотека C, используемая для генерации UUID, конкретной ссылки на использованиеhttp://linux.die.net/man/3/libuuid, Пример следующий:

       int main(int argc, char **argv)

{ uuid_t uuid; char str[36]; uuid_generate(uuid); uuid_unparse(uuid, str); printf(“%sn”, str); return ; }

Необходимо связать библиотеку uuid при компиляции под Linux

gcc -o uuid uuid.c -luuid

​​​

В Ubuntu libuuid можно установить с помощью следующей команды:

sudo apt-get install uuid-dev

Библиотека BoostЭто переносимая библиотека C ++ с открытым исходным кодом, которая обеспечивает реализацию UUID.

Следующий код может генерировать UUID

       boost::uuids::uuid a_uuid = boost::uuids::random_generator();

Qt – этоКроссплатформенностьВ среде программирования C ++ класс QUuid реализует такие функции, как генерация, сравнение и преобразование UUID.

функцияQUuid createUuid();Может использоваться для генерации случайного UUID. Примеры следующие

         int main()

{ QUuid uuid = QUuid::createUuid(); std::cout << qPrintable(uuid.toString()) << <span>std::endl; return ; }

Функция CoCreateGuid предоставляется под Windows для генерации GUID. Используемый заголовочный файл – objbase.h, связываемая библиотека – ole32.lib, а прототип функции:

HRESULT CoCreateGuid(GUID *pguid);

Прототип GUID

  typedef struct _GUID  {  DWORD Data1;  WORD Data2;  WORD Data3;  BYTE Data4[8];  } GUID; 

UUID поддерживается выше JDK 1.5, использование выглядит следующим образом:

  import java.util.UUID;  String uuid = UUID.randomUUID().toString();

Интеллектуальная рекомендация

Androidstudio Findbugs Plugin Runding Proment Com.Google.wireless.indroid.sdk.stats.intellijindexingstats $ index

аномальный Error:Internal error: (java.lang.ClassNotFoundException) com.google.wireless.android.sdk.stats.IntellijIndexingStats$Index java.lang.ClassNotFoundException: com.google.wireless.android.sdk….

Как быстро оптимизировать Wi-Fi дома за 30 минут? У инженеров али есть хитрости

Путеводитель Али Мей: Современные люди не могут обойтись без мобильных телефонов, а тем более с Wi-Fi. Многие студенты часто жалуются на неудобное использование Wi-Fi дома, игры и просмотр видео завис…

TextView клавиатура становится отправить, серый отправить, оптимизация мелких деталей

В последнее время я выполняю такую ​​функцию, как публикация ответа и комментирование, обобщение знаний и их запись для облегчения последующего поиска. 1. Измените кнопку переноса клавиатуры в UITextV…

[Linux] Установите phpMyadmin

1. Загрузите установочный пакет phpMyAdmin. 2. Поместите загруженный установочный пакет в веб-каталог. 3. Настройте phpmyadmin. Введите phpmyadmin, и вы увидите config.sample.inc.php , затем cp config…

Проект строительства Vue-cli 3.x

Установите инструмент Scaffold Vue-Cli 3.x: Беги после завершения установки: Проект инициализации: Введите имя проекта по запросу. Отказ Отказ Отказ Затем подождите шаблон загрузки. CD входит в зависи…

Вам также может понравиться

О проблеме присвоения коробки после easyui

(1) При назначении страницы всплывающего окна в рамке Easyui, обнаружена, что значение всегда опустошено. Позже было обнаружено, что позвонит Document.getElementbyId («EditForm») в методе …

Измените ширину отображения метки в Layui

Возникшие проблемы   решение  …

SSD1306 (OLED-экран) проблема обратного дисплея

Вчера вступил во владение проектом, который нуждался в обслуживании. Один из экранов OLED всегда менялся. Вот оригинальный драйвер: Мне потребовалось много времени, чтобы найти его. , , Чтобы изменить…

201621123015 «Программирование на Java», неделя, 11 недель

1. Итоги обучения на этой неделе 2. Письменные задания 1. Чтение исходного кода: многопоточная программа BounceThread 1.1 Для чего нужен класс BallRunnable? Почему мне нужно вызвать Thread.sleep для с…

Применение извлечения: возьмите зеркало бинарного дерева в качестве примера (иллюстрация, углубленный анализ каждого шага)

Проблема разработки: управлять данным двоичным деревом, преобразуйте его в зеркало источника два вилка Идеи решения: Для этой проблемы вы можете решить, вы можете решить ее, с третьей стороной перемен…

Каждый компьютер в сети должен иметь уникальный идентификатор UUID или GUID (в терминологии Microsoft). Он позволяет на базе этого ID аутентифицировать и активировать (при необходимости активации лицензий) компьютер.

Чтобы узнать GUID Windows компьютера, выполните команду Powershell на локальном компьютере:

get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID

get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID

или удаленно:

get-wmiobject Win32_ComputerSystemProduct -computername PC_NAME | Select-Object -ExpandProperty UUID

get-wmiobject Win32_ComputerSystemProduct -computername PC_NAME | Select-Object -ExpandProperty UUID

Это же значение содержится в реестре в ветке HKLMSOFTWAREMicrosoftCryptographyMachineGuid.

Однако, если речь идет о виртуальных машинах, Vmware технически позволяет создать (или клонировать) машины, сохраняя идентичный UUID, что конечно плохо. UUID основан на пути к конфигурационному файлу VM и он генерируется, когда вы первый раз включаете машину или ресетите (сбрасываете до изначального состояния) её. Эта информация записывается в SMBIOS файл конфигурации виртуальной машины — *.vmx. Файл текстовый, его можно редактировать в текстовом редакторе.

Нужная вам строка будет выглядеть примерно так: uuid.bios = «00 11 22 33 44 55 66 77-88 99 aa bb cc dd ee ff»

Соответственно, вы можете поменять значение на уникальное. Все действия необходимо производить на выключенной виртуальной машине.

Больше информации в статье Vmware.

Альтернативно, вы можете изменить UUID группы виртуальных машин, если они расположены на ESXi, через PowerCLI, используя скрипт на Powershell.

Для запуска скрипта вам нужно указать IP адрес ESX хоста в качестве аргумента, где находится виртуалка. Например, changeUUID.ps1 192.168.0.10.

if ($args[ ].length -gt  ) {      connect-viserver $args[ ] $VMs = get-vm     foreach ($vm in $VMs){ $date = get-date -format “dd hh mm ss”         $newUuid =56 4d 50 2e 9e df e5 e4-a7 f4 21 3b ” + $date echo “VM: ” $VM.name “New UUID: ” $newuuid $spec = New-Object VMware.Vim.VirtualMachineConfigSpec         $spec.uuid = $newUuid $vm.Extensiondata.ReconfigVM_Task($spec) start-sleep -s 2 } } else {Echo “Must supply IP address of ESX host. e.g. .changeUUID.ps1 192.168.0.10”}

if ($args[0].length -gt 0) { connect-viserver $args[0] $VMs = get-vm foreach ($vm in $VMs){ $date = get-date -format “dd hh mm ss” $newUuid = “56 4d 50 2e 9e df e5 e4-a7 f4 21 3b ” + $date echo “VM: ” $VM.name “New UUID: ” $newuuid $spec = New-Object VMware.Vim.VirtualMachineConfigSpec $spec.uuid = $newUuid $vm.Extensiondata.ReconfigVM_Task($spec) start-sleep -s 2 } } else {Echo “Must supply IP address of ESX host. e.g. .changeUUID.ps1 192.168.0.10”}

[Посещений: 8 867, из них сегодня: 3]

 

Программирование системы

   

18.04.2016 14:57

   

11128

UUID (Universally Unique Identifier) – это уникальный 16 байтный (128 битный) идентификатор, который выглядит следующим образом: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Вероятность повторения UUID очень низкая. Система 1С позволяет, при получении объектов из другой базы 1С, через COM-соединение возвращать их уникальные идентификаторы функцией UUID().

Соединитель = Новый COMObject("V83.COMConnector"); СоединениеCOM = Соединитель.Connect(СтрокаПодключения);  Запрос = СоединениеCOM.NewObject("Запрос"); Запрос.Текст =  ;   РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать();   Если Выборка.Следующий() Тогда   ГУИД = Выборка.Ссылка.UUID(); СтроковыйГУИД = СоединениеCOM.String(ГУИД);  КонецЕсли; 

Если необходимо создать элемент справочника в текущей базе с ГУИДом COM-объекта.

Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтроковыйГУИД)); Номенклатура.УстановитьСсылкуНового(Ссылка); 

Комментарии (0)

Для того чтобы добавить сообщение, необходимо Войти или Зарегистрироваться

 
 
  • Регистрация
  • Восстановить пароль
  • Вход
 

Разумеется, это не так. Я уже большому количеству людей наглядно доказывал, что они ошибаются. В сказку про уникальность UUID верят почти все. Не знаю, кто первый начал распространять эту ложную информацию, но в уникальность UUID-ов верит просто огромное количество людей.

Мы же подумаем логически. UUID — это 128-битный идентификатор. Его разрядность ограничена. А значит, каким бы алгоритмом генерации мы не пользовались, то даже в самом лучшем для нас случае существует 2128 комбинаций UUID-ов, после которых любой новый сгенерированный UUID будет повторять один из ранних. Что однозначно доказывает, что UUID НЕ уникален. Вернее даже то, что UUID не имеет математической уникальности. На самом деле, генерация повторного UUID-а произойдёт гораздо раньше, здесь мы рассмотрели самый идеальный случай.

UUID имеет статистическую уникальность, что означает такую маленькую вероятность генерации точно такого же UUID-а, что её в большинстве случаев (но не во всех) можно пренебречь. Статистическая уникальность достигается с помощью различных алгоритмов генерации UUID.

Чтобы не быть голосновным, разумеется, нужно привести источники. Например, wikipedia даже приводит формулу расчёта вероятности повторения UUID.

Поделиться:

– это идентификатор GUID, уникальный 100% времени?

будет ли он оставаться уникальным по нескольким потокам?

516   19  

19 ответов:

пока каждый сгенерированный GUID не является гарантированно быть уникальным, всего количество уникальных ключей (2^128 или 3.4×10^38) настолько велика, что вероятность того, что одно и то же число будет генерируется дважды очень мало. Для пример, рассмотрим наблюдаемый Вселенной, который содержит около 5×10^22 звезды; каждая звезда могла бы тогда иметь 6.8×10^15 универсально уникальных идентификаторов GUID.

С Википедия.

вот некоторые хорошие статьи как создается GUID (для .NET) и как вы можете получить тот же guid в правильной ситуации.

http://ericlippert.com/2012/04/24/guid-guide-part-one/

http://ericlippert.com/2012/04/30/guid-guide-part-two/

http://ericlippert.com/2012/05/07/guid-guide-part-three/

простой ответ: да.

Раймонд Чен написал большая статья на GUID и почему подстроки GUID являются не гарантированно уникальный. Статья идет в некоторую глубину о том, как создаются GUID и данные, которые они используют для обеспечения уникальности, которые должны идти до некоторой длины в объяснении почему они 🙂

Если вы боитесь одних и тех же значений GUID, то поместите два из них рядом друг с другом.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString(); 

Если вы слишком параноик, то поставьте три.

в качестве дополнительной заметки я играл с GUID Тома в Windows XP. Это очень неясный макет раздела с тремя дисками и четырнадцатью томами.

?Volume{23005604-eb1b-11de-85ba-806d6172696f} (F:) ?Volume{23005605-eb1b-11de-85ba-806d6172696f} (G:) ?Volume{23005606-eb1b-11de-85ba-806d6172696f} (H:) ?Volume{23005607-eb1b-11de-85ba-806d6172696f} (J:) ?Volume{23005608-eb1b-11de-85ba-806d6172696f} (D:) ?Volume{23005609-eb1b-11de-85ba-806d6172696f} (P:) ?Volume{2300560b-eb1b-11de-85ba-806d6172696f} (K:) ?Volume{2300560c-eb1b-11de-85ba-806d6172696f} (L:) ?Volume{2300560d-eb1b-11de-85ba-806d6172696f} (M:) ?Volume{2300560e-eb1b-11de-85ba-806d6172696f} (N:) ?Volume{2300560f-eb1b-11de-85ba-806d6172696f} (O:) ?Volume{23005610-eb1b-11de-85ba-806d6172696f} (E:) ?Volume{23005611-eb1b-11de-85ba-806d6172696f} (R:)                                      | | | | |                                      | | | | +-- 6f = o                                      | | | +---- 69 = i                                      | | +------ 72 = r                                      | +-------- 61 = a                                      +---------- 6d = m 

дело не в том, что GUID очень похожи, а в том, что все GUID имеют строку “mario” в них. Это совпадение или есть объяснение этому?

теперь, когда гуглить для части 4 в GUID я нашел около 125.000 хитов с объемом идентификатор GUID.

вывод: когда дело доходит до GUID Тома, они не так уникальны, как другие GUID.

да, GUID всегда должен быть уникальным. Он основан как на оборудовании, так и на времени, а также на нескольких дополнительных битах, чтобы убедиться, что он уникален. Я уверен, что теоретически возможно получить два одинаковых, но крайне маловероятно в реальном сценарии.

вот отличная статья Раймонда Чена о Guids:

http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

этого не должно произойти. Тем не менее, когда .Сетка находится под большой нагрузкой, можно получить повторяющиеся идентификаторы GUID. У меня есть два разных веб-сервера, использующих два разных сервера sql. Я пошел, чтобы объединить данные и обнаружил, что у меня было 15 миллионов GUID и 7 дубликатов.

GUID статистически уникальны. Шансы двух разных клиентов, генерирующих один и тот же Guid, бесконечно малы (при условии отсутствия ошибок в коде генерации Guid). Вы также можете беспокоиться о сбоях вашего процессора из-за космического луча и решить, что 2+2=5 сегодня.

несколько потоков, выделяющих новые GUID, получат уникальные значения, но вы должны получить, что вызываемая функция является потокобезопасной. В какой среде это происходит?

Эрик Липперт написал очень интересную серию статей о GUIDs.

есть по порядку 230 персональные компьютеры в мире (и из конечно, много ручных устройств или некомпьютерных устройств, которые более или менее те же уровни вычислительной мощности, но позволяет игнорировать те.) Давайте предположим, что мы поместили все эти ПК в мире задача генерации GUID; если каждый из них может генерировать, скажем, 220 идентификаторы в во-вторых, после того, как только около 272 секунд…сто пятьдесят триллион лет — у тебя будет очень высокий вероятность возникновения столкновение с указанным идентификатором GUID. И шансы на столкновение получаются довольно хорошо после всего лишь тридцати триллионов лет.

теоретически, нет, они не уникальны. Это возможно, чтобы создать идентичный идентификатор снова и снова. Однако шансы на то, что это произойдет, настолько низки, что вы можете предположить, что они уникальны.

Я читал раньше, что шансы настолько низки, что вы действительно должны подчеркнуть что-то еще-например, ваш сервер спонтанно сгорает или другие ошибки в вашем коде. То есть, предположим, что он уникален и не строит никакого кода, чтобы “поймать” дубликаты-потратьте свое время на что-то более вероятное чтобы произошло (т. е. что-нибудь другое).

Я сделал попытку чтобы описать полезность GUID для аудитории моего блога (нетехнические члены семьи). Оттуда (через Википедию), шансы на создание дубликата GUID:

  • 1 в 2^128
  • 1 в 340 undecillion (не волнуйтесь, undecillion не находится на викторина)
  • 1 в 3.4 × 10^38
  • 1 in 340,000,000,000,000,000,000,000,000,000,000,000,000

кажется, никто не упоминает фактическую математику вероятности ее возникновения.

во-первых, предположим, что мы можем использовать все 128-битное пространство (Guid v4 использует только 122 бита).

мы знаем, что общая вероятность не получить дубликат в n выборка-это:

(1-1/2128)(1-2/2128)…(1-(n-1) / 2128)

потому что 2128 намного больше, чем n, мы можем приблизительно это:

(1-1/2128)n (n-1)/2

и потому что мы можем предположить n намного больше 0, мы можем приблизить это к:

(1-1/2128)n^2/2

теперь мы можем приравнять это к” приемлемой ” вероятности, скажем, 1%:

(1-1/2128)n^2/2 = 0,01

который мы решаем для n и

n = sqrt(2 * log 0.01 / log (1-1 / 2128))

какой Вольфрам Альфа становится 5.598318 × 1019

чтобы поместить это число в перспективу, давайте возьмем 10000 машин, каждая из которых имеет 4-ядерный процессор, делает 4 ГГц и тратит 10000 циклов на создание Guid и ничего больше не делает. Это займет ~111 лет, прежде чем они создайте дубликат.

от http://www.guidgenerator.com/online-guid-generator.aspx

что такое GUID?

GUID (или UUID) – это аббревиатура для “глобального уникального идентификатора” (или “универсального уникального идентификатора”). Это 128-битное целое число, используемое для идентификации ресурсов. Термин GUID обычно используется разработчиками, работающими с технологиями Microsoft, в то время как UUID используется везде.

насколько уникален a Идентификатор GUID?

128-бит достаточно большой, и алгоритм генерации достаточно уникален, что если бы 1,000,000,000 GUID в секунду были сгенерированы в течение 1 года, вероятность дублирования была бы только 50%. Или если бы каждый человек на Земле генерировал 600 000 000 GUID, вероятность дубликата была бы только 50%.

Я испытал дубликат GUID.

Я использую аккуратный настольный сканер квитанций, и он поставляется с проприетарным программным обеспечением для баз данных. Программное обеспечение имеет функцию синхронизации с облаком, и я продолжал получать ошибку при синхронизации. Взгляд на бревна показал удивительную строку:

“ошибки”: [{“код”: 1, “сообщение”: “creator_guid: уже есть принято”, “guid”: “C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}

Я был немного в недоумении, но, конечно, когда Я нашел способ в моей локальной базе данных neatworks и удалил запись, содержащую этот GUID, ошибка перестала происходить.

чтобы ответить на ваш вопрос с некоторым свидетельствам, нет. Дубликат возможен. Но вполне вероятно, что причина, по которой это произошло, была не случайностью, а из-за того, что стандартная практика не соблюдалась каким-то образом. (Я просто не так повезло) однако, я не могу сказать наверняка. Это не мое программное обеспечение.

их поддержка клиентов была очень вежливой и полезно, но они, должно быть, никогда не сталкивались с этой проблемой раньше, потому что после 3+ часов по телефону с ними они не нашли решения. (FWIW, я очень впечатлен Neat, и этот глюк, несмотря на разочарование, не изменил моего мнения об их продукте.)

Если ваши системные часы установлены правильно и не обернуты вокруг, и если ваш сетевой адаптер имеет свой собственный MAC (т. е. вы не установили пользовательский MAC), и ваш поставщик NIC не перерабатывал Mac (что они не должны делать, но что, как известно, происходит), и если функция генерации GUID вашей системы правильно реализована, то ваша система никогда не будет генерировать дубликаты GUID.

Если все на земле, кто генерирует GUID следует этим правилам, то ваши GUID будут глобально уникальный.

на практике количество людей, которые нарушают правила, невелико, и их гиды вряд ли “сбежат”. Конфликты статистически маловероятны.

MSDN:

существует очень низкая вероятность того, что значение нового Guid равно нулю или равно любому другому Guid.

– это идентификатор GUID, уникальный 100% времени?

не гарантируется, так как существует несколько способов генерации одного. Однако вы можете попытаться вычислить вероятность создания двух идентичных GUID, и вы получите идею: GUID имеет 128 бит, следовательно, есть 2128 различные GUIDs –много больше, чем звезд в известной нам Вселенной. Читайте статья в Википедии для более подробной информации.

Я испытал, что GUID не являются уникальными во время многопоточного / многопроцессорного модульного тестирования (тоже?). Я думаю, что это связано с тем, что все остальные тинги равны, одинаковый посев (или отсутствие посева) псевдослучайных генераторов. Я использовал его для создания уникальных имен файлов. Я обнаружил, что ОС намного лучше это делает:)

троллинг предупреждение

вы спрашиваете, если GUID на 100% уникальны. Это зависит от количества GUID, среди которых он должен быть уникальным. Как количество подходов идентификаторы бесконечности, вероятность дублирования GUID приближается к 100%.

в более общем смысле это известно как” проблема дня рождения “или”парадокс дня рождения”. Википедия имеет довольно хороший обзор на: Википедия-Проблема С Днем Рождения

в очень грубых терминах квадратный корень из размера пула является грубым приближением, когда вы можете ожидать 50% – ный шанс дубликата. Статья включает в себя таблицу вероятностей размера пула и различные вероятности, в том числе строку для 2^128. Так что для 1% вероятности столкновения вы бы ожидайте случайного выбора 2.6 * 10^18 128-битных чисел. Шанс 50% требует 2,2 * 10^19 выборов, в то время как SQRT(2^128) составляет 1,8*10^19.

конечно, это просто идеальный случай действительно случайного процесса. Как уже упоминалось, многое зависит от того, что random аспект-насколько хорош генератор и семя? Было бы неплохо, если бы была какая-то аппаратная поддержка, чтобы помочь с этим процессом, который был бы более пуленепробиваемым, за исключением того, что все может быть подделано или виртуализировано. Я подозреваю, что это может быть причиной того, что MAC-адреса/метки времени больше не включены.

алгоритмы GUID обычно реализуются в соответствии со спецификацией V4 GUID, которая по существу является псевдослучайной строкой. К сожалению, они попадают в категорию “вероятно, не уникальный”, из Википедии (я не знаю, почему так много людей игнорируют этот бит): “… другие версии GUID имеют различные свойства уникальности и вероятности, начиная от гарантированной уникальности до вероятной неединственности.”

псевдо-случайных свойств и V8 для JavaScript Math.random() несколько Ужасный в уникальности, с столкновениями, часто возникающими после нескольких тысяч итераций, но V8 не единственный виновник. Я видел столкновения GUID в реальном мире, используя как PHP, так и Ruby-реализации V4 GUID.

поскольку становится все более распространенным масштабирование генерации идентификаторов на нескольких клиентах и кластерах серверов, энтропия принимает большой удар – вероятность того, что одно и то же случайное семя будет использоваться для генерации идентификатора, возрастает (время часто используется как случайное семя в псевдо-генераторы случайных), и идентификатор GUID столкновения перерастают из “Скорее всего неуникальный” до “очень вероятно, чтобы вызвать много неприятностей”.

чтобы решить эту проблему, я решил создать алгоритм ID, который мог бы безопасно масштабироваться и обеспечивать лучшие гарантии от столкновения. Это делается с помощью метки времени, счетчика клиента в памяти, отпечатка пальца клиента и случайных символов. Сочетание факторов создает аддитивную сложность, которая особенно устойчива к столкновению, даже если вы масштабируете это по ряду хостов:

http://usecuid.org/

ответ ” является ли GUID 100% уникальным?” просто “нет” .

  • Если вы хотите 100% уникальность GUID, то сделайте следующее.

    1. создать GUID
    2. проверьте, существует ли этот идентификатор GUID в столбце таблицы, где вы ищете uniquensess
    3. если существует, то перейти Шаг 1 еще Шаг 4
    4. используйте этот идентификатор GUID как уникальный.

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий