UUID (Универсальный уникальный идентификатор), также известный как GUID (Глобальный уникальный идентификатор), представляет собой 128-битное значение, уникальное для всех практических целей. Стандартное представление UUID использует шестнадцатеричные цифры (октеты):
123e4567-e89b-12d3-a456-556642440000
UUID состоит из шестнадцатеричных цифр (по 4 символа) и 4 символов” -“, которые делают его длиной, равной 36 символам.
Нулевой UUID-это специальная форма UUID, в которой все биты равны нулю.
В этом уроке мы рассмотрим класс UUID в Java. Сначала мы посмотрим, как использовать сам класс. Затем мы рассмотрим различные типы UUID и то, как мы можем генерировать их в Java.
Дальнейшее чтение:
CharSequence против Строка в Java
Использовать массив char[] Над строкой для манипулирования паролями в Java?
Руководство по пулу строк Java
2. Класс UUID
Класс UUID имеет один конструктор:
UUID uuid = new UUID(long mostSignificant64Bits, long leastSignificant64Bits);
Если мы хотим использовать этот конструктор, нам нужно предоставить два длинных значения. Однако это требует, чтобы мы сами построили битовый шаблон для UUID.
Serial Number: BIOS Setup | Lenovo Support Quick Tips
Для удобства существует три статических метода создания UUID.
Этот первый метод создает UUID версии 3 из заданного массива байтов:
UUID uuid = UUID.nameUUIDFromBytes(byte[] bytes);
Во-вторых, метод randomUUID() создает UUID версии 4. Это самый удобный способ создания UUID :
UUID uuid = UUID.randomUUID();
Третий статический метод возвращает объект UUID с учетом строкового представления данного UUID:
UUID uuid = UUID.fromString(String uuidHexDigitString);
Давайте теперь посмотрим, как структурирован UUID.
3. Структура
Давайте возьмем пример UUID:
123e4567-e89b-42d3-a456-556642440000 xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx
3.1. Вариант UUID
A представляет вариант, определяющий расположение UUID. Все остальные биты в UUID зависят от настройки битов в поле вариант. Вариант определяется тремя наиболее значимыми битами:
MSB1 MSB2 MSB3 0 X X reserved (0) 1 0 X current variant (2) 1 1 0 reserved for Microsoft (6) 1 1 1 reserved for future (7)
Значение A в упомянутом UUID равно “a”. Двоичный эквивалент “а”) показывает вариант как 2.
3.2. Версия UUID
B представляет версию. Версия в упомянутом UUID (значение B ) равна 4.
Java предоставляет методы для получения варианта и версии UUID:
UUID uuid = UUID.randomUUID(); int variant = uuid.variant(); int version = uuid.version();
Это пять различных версий для варианта 2 Uuid: основанная на времени (UUID v1), безопасность DCE (UUIDv2), основанная на имени (UUID v3 и UUIDv5) и случайная (UUIDv4).
Java предоставляет реализацию для v3 и v4, но также предоставляет конструктор для создания любого типа UUID:
UUID uuid = new UUID(long mostSigBits, long leastSigBits);
4. Версии UUID
4.1. Версия 1
UUID версии 1 основан на текущей метке времени, измеренной в единицах 100 наносекунд с 15 октября 1582 года, связанной с MAC-адресом устройства, на котором создается UUID.
How to Update Serial Number,Type and UUID in Bios, Lenovo Thinkpad | Machine Serial Number invalid
Если вас беспокоит конфиденциальность, UUID версии 1 может быть сгенерирован со случайным 48-битным номером вместо MAC-адреса. В этой статье мы рассмотрим эту альтернативу.
Во-первых, мы сгенерируем 64 наименьших и наиболее значимых бита в виде длинных значений:
private static long get64LeastSignificantBitsForVersion1() < Random random = new Random(); long random63BitLong = random.nextLong() long variant3BitFlag = 0x8000000000000000L; return random63BitLong + variant3BitFlag; >private static long get64MostSignificantBitsForVersion1() < LocalDateTime start = LocalDateTime.of(1582, 10, 15, 0, 0, 0); Duration duration = Duration.between(start, LocalDateTime.now()); long seconds = duration.getSeconds(); long nanos = duration.getNano(); long timeForUuidIn100Nanos = seconds * 10000000 + nanos * 100; long least12SignificatBitOfTime = (timeForUuidIn100Nanos > 4; long version = 1
Затем мы можем передать эти два значения конструктору UUID:
public static UUID generateType1UUID()
4.2. Версия 2
Версия 2 основана на метке времени и MAC-адресе. Однако RFC 4122 не указывает точных деталей генерации, поэтому мы не будем рассматривать реализацию в этой статье.
4.3. Версии 3 и 5
UUID генерируются с использованием хэша пространства имен и имени. Идентификаторами пространства имен являются UUID, такие как Система доменных имен (DNS), идентификаторы объектов (OID), URL-адреса и т. Д.
UUID = hash(NAMESPACE_IDENTIFIER + NAME)
Единственное различие между UUIDv3 и UUIDv5 заключается в алгоритме хеширования — v3 использует MD5 (128 бит), в то время как v5 использует SHA-1 (160 бит).
Проще говоря, мы усекаем полученный хэш до 128 бит, а затем заменяем 4 бита для версии и 2 бита для варианта.
Давайте сгенерируем UUID типа 3:
byte[] nameSpaceBytes = bytesFromUUID(namespace); byte[] nameBytes = name.getBytes(«UTF-8»); byte[] result = joinBytes(nameSpaceBytes, nameBytes); UUID uuid = UUID.nameUUIDFromBytes(result);
Здесь важно отметить, что шестнадцатеричная строка для пространства имен сначала должна быть преобразована в массив байтов.
Наконец, Java не предоставляет реализацию для типа 5. Проверьте исходный код репозиторий для UUIDv5.
4.4. Версия 4
Реализация UUID v4 использует случайные числа в качестве источника. Реализация Java-это SecureRandom , которая использует непредсказуемое значение в качестве начального для генерации случайных чисел, чтобы уменьшить вероятность столкновений.
Давайте сгенерируем UUID версии 4:
UUID uuid = UUID.randomUUID();
Давайте сгенерируем уникальный ключ, используя “SHA-256” и случайный UUID:
MessageDigest salt = MessageDigest.getInstance(«SHA-256»); salt.update(UUID.randomUUID().toString().getBytes(«UTF-8»)); String digest = bytesToHex(salt.digest());
5. Заключение
В этой статье мы рассмотрели, как структурирован UUID и какие существуют варианты и версии.
Восстановление повреждённой прошивки BIOS на ноутбуке программатором, в случае, если ноутбук не загружается. Часть 4. Восстановления информации DMI (серийников и ключей) в БИОСе ноутбука
Привет друзья! Из предыдущих статей мы с вами узнали, каким образом можно восстановить повреждённую прошивку BIOS на ноутбуке программатором, в случае, если ноутбук не загружается. Мы разобрали ноутбук и извлекли из него материнскую плату, затем подключили программатор к неисправной микросхеме BIOS и залили на него новую прошивку, скачанную с официального сайта производителя ноутбука. В итоге наш ноутбук оказался вполне работоспособным, но с чистым БИОСом, в котором не было никакой информации DMI (серийного номера ноутбука, лицензионного ключа предустановленной с магазина Windows и др.). В сегодняшней статье мы узнаем, как восстановить информацию DMI в БИОСе ноутбука!
Восстановление повреждённой прошивки BIOS на ноутбуке программатором, в случае, если ноутбук не загружается. Часть 4. Восстановления информации DMI (серийников и ключей) в БИОСе ноутбука
Автор Роман Нахват!
Во-первых, что такое DMI (Desktop Management Interface) — это специальный интерфейс управления, служащий в основном для сбора информации персонального компьютера. П оддержка DMI встроена в системный BIOS, для того, чтобы винда отслеживала изменения в аппаратной конфигурации компьютера. После установки чистой прошивки на наш ноутбук информация DMI в БИОСе обнулилась и п ри включении ноута стало выходить окно с предупреждением об отсутствии в БИОСе номера продукта, серийного номера и т.д, ещё установленная Windows запросила активацию. Восстановить информацию DMI очень просто, нужно всего лишь перенести данные DMI из старой прошивки в новую, а затем прошить BIOS заново.
Источник: remontcompa.ru
Русские Блоги
UUID — это аббревиатура универсального уникального идентификатора, который представляет собой уникальный идентификатор, сгенерированный машиной в определенном диапазоне (от определенного пространства имен до мира). UUID имеет следующие значения:
- Генерируется определенной машиной алгоритма
Чтобы гарантировать уникальность UUID, спецификация определяет элементы, включая MAC-адрес сетевой карты, временную метку, пространство имен (Namespace), случайное или псевдослучайное число, время и другие элементы, а также алгоритм для генерации UUID из этих элементов. Сложные характеристики UUID означают, что он может быть сгенерирован только компьютером, обеспечивая его уникальность.
- Обозначение без ручного управления, идентификация без ручного управления
UUID нельзя указать вручную, если вы не рискуете дублировать UUID. Сложность UUID определяет, что «нормальные люди» не могут напрямую знать, какой объект связан с UUID.
- Возможность повторения в определенном диапазоне крайне мала.
Основная цель алгоритма, определенного спецификацией генерации UUID, — обеспечить его уникальность. Но эта уникальность ограничена и может быть гарантирована только в пределах определенного диапазона, который связан с типом UUID (см. Версию UUID).
UUID — это 16-байтовое 128-битное число, обычно представленное 36-байтовой строкой. Примеры:
Буквы в нем в шестнадцатеричной системе счисления, независимо от регистра.
Универсальный уникальный идентификатор (UUID) сВосемь классиковизRFC спецификация, Является 128-битным числом, также может быть выражено 32 шестнадцатеричными символами, разделенными знаком «-» посередине.
-Timestamp + номер версии UUID, разделенный на три сегмента, занимающих 16 символов (60 бит + 4 бит),
— Порядковый номер часов и зарезервированное поле, занимающее 4 символа (13 бит + 3 бит),
— идентификатор узла занимает 12 символов (48 бит),
GUID (глобальный уникальный идентификатор) — это псевдоним UUID; но в практических приложениях GUID обычно относится к UUID, реализованному Microsoft.
UUID имеет несколько версий, и каждая версия имеет разные алгоритмы и разные диапазоны приложений.
Во-первых, это особый случай — Nil UUID — обычно мы его не используем, он состоит из всех 0 чисел, как показано ниже:
UUID, версия 1: UUID на основе времени
Поскольку метка времени имеет полные 60 бит, вы можете потратить ее столько, сколько захотите, со 100 наносекундами как 1, считая с 15 октября 1582 года (может длиться 3655 лет, действительно сжечь больше цифр, 1582 интересно)
Идентификатор узла также имеет 48 битов, обычно выражаемых MAC-адресом, если есть несколько сетевых карт, просто используйте одну. Если у вас нет сетевой карты, используйте случайные числа, чтобы составить числа, или возьмите кучу другой информации, например имена хостов, и хешируйте их вместе.
16-битный порядковый номер используется только во избежание предыдущего изменения метки узла (например, смены сетевой карты), проблем с системой часов (например, замедления часов после перезапуска), пусть он будет случайным, чтобы избежать дублирования.
Но похоже, что в версии 1 не учитывалась ни проблема двух процессов на одной машине, ни параллелизм одной и той же временной метки, поэтому строгая версия 1 не была реализована, поэтому давайте рассмотрим каждый вариант.
Спящий режимCustomVersionOneStrategy.java, Что решает две проблемы версии 1 до
-Timestamp (6 байтов, 48 бит): уровень миллисекунд, начиная с 1970 года, может длиться 8925 лет .
-Последовательный номер (2 байта, 16 бит, максимум 65535): не существует такой вещи, как отметка времени, которая возвращается к нулю через одну секунду. У каждого свой путь. Когда короткое переполнение достигает отрицательного числа, оно возвращается к нулю.
-Идентификатор машины (4 байта, 32 бита): возьмите IP-адрес localHost, IPV4 составляет ровно 4 байта, но если это IPV6, 16 байтов, берутся только первые 4 байта.
— Идентификатор процесса (4 байта, 32 бита): используйте текущую временную метку, чтобы переместить 8 бит вправо, а затем используйте целое число, чтобы справиться с этим. Я не верю, что два потока будут запускаться одновременно.
Стоит отметить, что 64-битный Long, состоящий из машинного процесса и идентификатора процесса, почти не изменился, и достаточно другого Long.
Вариант версии 1-MongoDB
-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Распределены по:
-Timestamp (42bit) Количество миллисекунд с 2012 года (по сравнению с 1970 годом) может длиться 139 лет.
— последовательность автоинкремента (12 бит, максимум 4096), автоинкремент в миллисекундах и сброс на 0 через одну миллисекунду.
-DataCenter ID (5 бит, максимум 32), значение конфигурации.
— ID рабочего (5 бит, максимум 32), значение конфигурации. Поскольку это идентификатор диспетчера, достаточно 32 диспетчеров в центре обработки данных. Зарегистрируйтесь в ZK.
Можно видеть, что, поскольку это диспетчер чисел, идентификатор машины и идентификатор процесса опускаются, поэтому он может быть выражен только одним Long.
Кроме того, для диспетчера этого типа клиент может иметь только один идентификатор за раз и не может быть получен пакетами, поэтому дополнительная задержка является проблемой.
UUID версии 2: защищенный UUID DCE
Безопасный UUID DCE (распределенной вычислительной среды) и алгоритм UUID на основе времени одинаковы, но первые 4 позиции временной метки будут заменены на POSIX UID или GID. Эта версия UUID редко используется на практике.
UUID версии 3: UUID на основе имени (MD5)
UUID на основе имени получается путем вычисления хеш-значения MD5 имени и пространства имен. Эта версия UUID гарантирует: уникальность UUID, сгенерированных разными именами в одном пространстве имен; уникальность UUID в разных пространствах имен; повторное создание UUID с одним и тем же именем в одном пространстве имен одинаково.
UUID версии 4: случайный UUID
Сгенерировать UUID на основе случайного числа или псевдослучайного числа. Вероятность повторения этого UUID можно рассчитать, но случайные вещи похожи на покупку лотерейного билета: вы не можете рассчитывать на то, что он принесет вам целое состояние, но дерьмовая удача обычно приходит случайно.
UUID версии 5: UUID на основе имени (SHA1)
похож на алгоритм UUID версии 3, за исключением того, что при вычислении значения хеш-функции используется алгоритм SHA1 (алгоритм безопасного хеширования 1).
Из различных версий UUID видно, что версия 1/2 подходит для использования в распределенной вычислительной среде и имеет высокую степень уникальности; версия 3/5 подходит для уникальных имен в определенном диапазоне. И в средах, где UUID требуются или могут генерироваться повторно; что касается версии 4, я лично рекомендую не использовать ее (хотя это самый простой и удобный вариант).
Обычно мы рекомендуем использовать UUID для идентификации объектов или постоянных данных, но лучше не использовать UUID в следующих ситуациях:
- Объект типа отображения. Например, кодовая таблица только с кодами и названиями.
- Обслуживаемые вручную несистемные объекты. Например, некоторые основные данные в системе.
Для объектов с естественными характеристиками неповторяющихся имен лучше всего использовать UUID версии 3/5. Например, пользователи в системе. Если UUID пользователя версии 1, если вы случайно удалите его, а затем перестроите пользователя, вы обнаружите, что этот человек по-прежнему является этим человеком, а пользователь больше не является этим пользователем. (Хотя отметка как удаленная также является решением, это усложняет реализацию.)
- Java UUID Generator (JUG): генератор UUID с открытым исходным кодом, протокол LGPL, поддержка MAC-адресов.
- UUID: Специальная лицензия с исходным кодом.
- Встроенный генератор UUID в Java 5 и выше: кажется, что можно сгенерировать только UUID версии 3/4.
Кроме того, в Hibernate есть также генератор UUID, но это не UUID какой-либо (стандартной) версии, и это настоятельно не рекомендуется.
Метод генерации
Собраны некоторые методы генерации UUID, организованные следующим образом
Shell
- В большинстве сред Unix / Linux есть небольшой инструмент под названием uuidgen, который может генерировать UUID для стандартного вывода, запустив
- Прочитать файл /proc/sys/kernel/random/uuid Получите UUID, например:
cat /proc/sys/kernel/random/uuid
libuuid
libuuid — это библиотека C, используемая для генерации UUID, конкретной ссылки на использованиеhttp://linux.die.net/man/3/libuuid, Пример следующий:
Необходимо связать библиотеку uuid при компиляции под Linux
gcc -o uuid uuid.c -luuid
В Ubuntu libuuid можно установить с помощью следующей команды:
sudo apt-get install uuid-dev
boost uuid
Библиотека BoostЭто переносимая библиотека C ++ с открытым исходным кодом, которая обеспечивает реализацию UUID.
Следующий код может генерировать UUID
Qt QUuid
Qt — этоКроссплатформенностьВ среде программирования C ++ класс QUuid реализует такие функции, как генерация, сравнение и преобразование UUID.
функция QUuid createUuid(); Может использоваться для генерации случайного UUID. Примеры следующие
CoCreateGuid
Функция CoCreateGuid предоставляется под Windows для генерации GUID. Используемый заголовочный файл — objbase.h, связываемая библиотека — ole32.lib, а прототип функции:
HRESULT CoCreateGuid(GUID *pguid);
Java
UUID поддерживается выше JDK 1.5, использование выглядит следующим образом:
Источник: russianblogs.com
