У меня есть код, который выглядит так:
u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
return
}
u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?
return hex.EncodeToString(u)
Он возвращает строку длиной 32, но я не думаю, что это действительный UUID. Если это настоящий UUID, почему это UUID и какова цель кода, который изменяет значение u[8]
и u[6]
.
Есть ли лучший способ создания UUID?
Ответы:
Эти строки ограничивают значения байтов 6 и 8 определенным диапазоном.
rand.Read
возвращает случайные байты в диапазоне0-255
, которые не являются всеми допустимыми значениями для UUID. Насколько я могу судить, это должно быть сделано для всех значений в срезе.Если вы используете Linux, вы также можете позвонить
/usr/bin/uuidgen
.Что дает:
источник
u[6]
иu[8]
байтов.Вы можете сгенерировать UUID с помощью библиотеки go-uuid . Это может быть установлено с помощью:
Вы можете генерировать случайные (версия 4) UUID с помощью:
Возвращаемый
UUID
тип - это 16-байтовый массив, поэтому вы можете легко получить двоичное значение. Он также предоставляет стандартное шестнадцатеричное строковое представление через свойString()
метод.Код, который у вас есть, также выглядит так, как будто он также сгенерирует действительный UUID версии 4: побитовое манипулирование, которое вы выполняете в конце, устанавливает поля версии и варианта UUID, чтобы правильно идентифицировать его как версию 4 . Это сделано для того, чтобы отличать случайные UUID от UUID, сгенерированных с помощью других алгоритмов (например, UUID версии 1 на основе вашего MAC-адреса и времени).
источник
go-uuid
Библиотека НЕ RFC4122 совместимый. Биты варианта установлены неправильно. Члены сообщества предпринимали несколько попыток исправить это, но запросы на исправление не принимаются.Вы можете сгенерировать UUID с помощью библиотеки Go uuid, которую я переписал на основе
go-uuid
библиотеки. Есть несколько исправлений и улучшений. Это может быть установлено с помощью:Вы можете генерировать случайные (версия 4) UUID с помощью:
Возвращаемый тип UUID - это интерфейс, а базовый тип - это массив.
Библиотека также генерирует UUID v1 и правильно генерирует UUID v3 и 5. Есть несколько новых методов, помогающих с печатью и форматированием, а также новые общие методы для создания UUID на основе существующих данных.
источник
"crypto / rand" - это кроссплатформенный пакет для генерации случайных байтов.
источник
pseudo_uuid
потому что в нем отсутствуют неслучайные идентификаторы, такие как MAC-адрес и все, что еще указано в RFC4122? Так что на самом деле это более случайно.%x
возникают проблемы со значениями байтов меньше 128, вам нужно применить заполнение, то есть%04x
для пары байтовЕсть официальная реализация Google: https://github.com/google/uuid
Генерация UUID версии 4 работает следующим образом:
Попробуйте здесь: https://play.golang.org/p/6YPi1djUMj9
источник
New()
и это эквивалентноuuid.Must(uuid.NewRandom())
rand.Reader
. Я не уверен, что это когда-нибудь вернет ошибку, или это может произойти только с пользовательским Reader ...gofrs / uuid - это замена satori / go.uuid , который является наиболее популярным пакетом UUID для Go . Он поддерживает версии UUID 1–5 и соответствует RFC 4122 и DCE 1.1.
источник
От Russ Кокса пост :
Примечание. В исходной версии, предшествующей Go 1, первая строка была:
Здесь он компилируется и выполняется,
/dev/urandom
возвращает только все нули на игровой площадке. Должно работать нормально локально.В этом же потоке найдены некоторые другие методы / ссылки / пакеты.
источник
import "crypto/rand"
мой взгляд, лучше использовать , но +1 заuuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. В сочетании с кодом OP, и это отлично работает.Как часть спецификации uuid, если вы генерируете uuid из случайного числа, он должен содержать «4» в качестве 13-го символа и «8», «9», «a» или «b» в 17-м ( исходном ).
источник
В пакете gorand есть метод UUID, который возвращает UUID версии 4 (сгенерированный случайным образом) в его каноническом строковом представлении («xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx») и соответствует RFC 4122.
Он также использует пакет crypto / rand для обеспечения наиболее криптографически безопасного создания UUID на всех платформах, поддерживаемых Go.
источник
В Linux вы можете прочитать
/proc/sys/kernel/random/uuid
:Никаких внешних зависимостей!
источник
Для Windows я недавно сделал это:
источник
Эта библиотека является нашим стандартом для генерации и анализа uuid:
https://github.com/pborman/uuid
источник