![]() |
|
|
![]()
|
|
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
Никак не могу найти описание алгортма генерации UUID (или как их еще называют GUID). Вроде это дело стандартизованно и даже описывается ISO/IEC 11578:1996, но найти в свободном доступе текст этого стандарта, не удалось.
Хотелось бы описание алгоритма для
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
В линуксах используется генерация GUID на базе MAC адреса.
Можно глянуть исходняки libuuid.so UUID не то же, что и GUID. UUID уникален в текущий момент на конкретной машине. GUID - уникален абсолютно.
Банальная генерация от системного времени (дата, время, микросекунды).
Просто рэндомим. Либо на авось, либо имеем хранилище созданных UUID'ов Про остальные не скажу, но они не дают абсолютной уникальности. Также бывает банальная инкрементная генерация. Абсолютная уникальность бывает только за счет генерации на основе железа, а дальше дополняется другими алгоритмами. |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
Меня интересует именно описание алгоритма, расписанное до бит, в каком бите что хранится. Там ведь есть вполне конкретный формат:
вот описание остальных форматов я и ищу, особенно интересует формат с использованием MAC адреса. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
Могу предложить только линуксовые исходняки на C:
http://cvs.opensolaris.org/source/xref/usr...libuuid/common/ и http://devel.santafelinux.com/source/scrol...0.3.14/libuuid/ Виндовых исходняком, естественно, дать не могу. А зачем тебе это вообще? Ведь GUIDы создаются стандартными средствами. Или ты наоборот разобрать хочешь? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
Мне надо написать свой генератор на Java. Там есть стандартный UUID, но он появился в JDK 1.5 и не использует MAC, а это крайне желательно.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
Хм. Я конечно не большой спец по JAVA. Но сдается мне, что получить MAC адрес без встроенной поддержки VM не получится.
Если таковая все же имеется, то тогда нужно определиться со стандартом. UUIDы бывают разной длины. Учитывая, что интересует MAC генерация, полагаю, что тебе нужен именно GUID. Если получить MAC реально, то можно написать код на базе линуксового. Что касается готового кода, то нашел ветку с примером на сановском форуме: http://forum.java.sun.com/thread.jspa?thre...ssageID=1031698 Там есть пример генерации 128битного GUIDa, но базирован на параметрах системы. Это конечно не абсолютно Global UID, но как там сказано, достаточно близко к этому. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
MAC адрес я уже научился получать, осталось только сгенерировать GUID с его использованием. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
GUID на базе MAC выглядит примерно так:
Первые 8 байт это TimeStamp. Причем последние полбайта - номер версии GUID'a = 1. То есть сдвигаем TimeStamp на 4 бита и вписываем в них номер версии. (то есть еденичку) Затем Идут 2 байта - счетчик. То есть, если мы в один TimeStamp успеваем сгенерить несколько гуидов, то этот счетчик увеличивается. Если таймстамп перешагнул дальше, то сбрасываем. Эти два байта также сдвигаем, но на 2 бита. Младшие 2 бита зарезервированы. Последние 6 байт - просто MAC адрес. Переводим в HEX, добавляем разделители. GUID готов. Это базовый стандарт GUID первой версии. Винда, похоже, просто берет данные, добавляет рэндом и конвертит по какому-то алгоритму, исключающему повтор при разных входных данных. Как я уже говорил, реализация M$ мне недоступна. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Насколько я в курсе, при вычислении этих данных используется текущее время и дата, что теоретически гарантирует уникальность |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 2 Всего: 484 |
Если читал пост, то только об этом и говорится. Я имею ввиду то, что у GUID'a сгенереного виндой, отсутсвуют фиксированные части. Каждый раз GUID получается совершенно (а не чуть-чуть) разным. Значит используется какой-то хитрый алгоритм, который так перемешивает входные данные. Пример: Стандартные GUID: {00008F2C-72C1-0000-0000-8C8H92C09E12} {00008F2C-72C1-0000-0008-8C8H92C09E12} {00008F2D-72C1-0000-0000-8C8H92C09E12} {00008F2D-72C1-0000-0010-8C8H92C09E12} GUIDы винды: {280936f3-6b32-4536-a99b-7b6cf95a0f0b} {d19ce482-d817-4649-8da6-4dc2642c961c} {0c54a729-d92f-477c-bea5-31b24ac1c59f} {1b65a986-fce4-409d-8f35-0f2d4dae10f1} Налицо явное отсутствие постоянной части. Налицо отличие от стандарта первой версии. Да я вообще не знаю, как он устроен. У него даже поле версии всегда разное. Сплошной рэндом какой-то. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
На самом деле они присутсвуют, это: {XXXXXXX-XXXX-4XXX-AXXX-XXXXXXXXXXXX} вместо A может быть 8, 9, A, B. А вообще я нашел спецификацию. Всем спасибо за помощь! Присоединённый файл ( Кол-во скачиваний: 41 )
draft_leach_uuids_guids_01.zip 15,71 Kb-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
А вот скажите мне, как в системах, основанных на Timestamp, решается вопрос с переходом на зимнее время (то есть когда стрелка переводится назад)? Ведь при этом в течение целого часа будет существовать возможность генерации дубликатных ID. Теоретически можно использовать счетчик, как описал Snowy, но тогда нужно будет хранить довольно таки здоровый мап из ID, сгенерированных за последний час, да еще как-то чистить его асинхронным образом (впрочем, можно и синхронным, но может быть немножко накладно). Кто как думает? -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
Во первых там используется GMT, а во вторых используется инкрементальный счетчик. Посмотри спецификацию, что я прикрепил, там это достаточно подробно освещенно. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Stampede |
|
||||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
Само по себе использование GMT не решает проблему перевода времени "взад", как в случае с переходом на зимнее время. А счетчик, выходит, действительно используется, и при этом не совсем так, как написал Snowy.
Век живи, век учись Вопрос только, как узнать, что время было переведено назад? А, понял: в ходе сессии хранить только самый последний Timestamp, и сравнивать с текущим временем при каждом новом обращении к генератору, а при каждом рестарте системы иницииализироватьрвать заново.
Кстати, а как получил? |
||||||
|
|||||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: нет Всего: 538 |
В GMT нет понятия зимнего/летнего времени.
ipconfig /all и ifconfig а дальше парсинг stdout -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |