Показаны сообщения с ярлыком пакет crypto/rand в Golang. Показать все сообщения
Показаны сообщения с ярлыком пакет crypto/rand в Golang. Показать все сообщения

понедельник, 27 апреля 2020 г.

Генерация уникальной строки (UUID, GUID) в Golang

Универсально уникальный идентификатор (UUID) или глобально уникальный идентификатор (GUID) - это 128-битное число, используемое для идентификации информации.

  • UUID уникален для практических целей: вероятность его дублирования очень близка к нулю.
  • UUID не зависят от центрального органа или координации между теми, кто их генерирует.

Строковое представление UUID состоит из 32 шестнадцатеричных цифр, отображаемых в 5 группах, разделенных дефисами. Например:

123e4567-e89b-12d3-a456-426655440000

Пример генератора UUID

Вы можете использовать функцию rand.Read из пакета crypto/rand для генерации базового UUID.

b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
    log.Fatal(err)
}
uuid := fmt.Sprintf("%x-%x-%x-%x-%x",
    b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
fmt.Println(uuid)

Вывод:

9438167c-9493-4993-fd48-950b27aad7c9

Ограничения

Этот UUID не соответствует RFC 4122. В частности, он не содержит номеров версий или вариантов.

Предупреждение: вызов rand.Read возвращает ошибку в случае сбоя основного системного вызова. Например, если он не может прочитать /dev/urandom в системе Unix, или если CryptAcquireContext не работает в системе Windows.


Читайте также:


воскресенье, 26 апреля 2020 г.

Удобный доступ к crypto/rand для создания случайных чисел в Golang

Go имеет два пакета для случайных чисел:

  • math/rand реализует большой выбор генераторов псевдослучайных чисел.
  • crypto/rand реализует криптографически безопасный генератор псевдослучайных чисел с ограниченным интерфейсом.

Два пакета можно объединить, вызвав rand.New в пакете math/rand с источником, который получает данные из crypto/rand.

import (
    crand "crypto/rand"
    rand "math/rand"

    "encoding/binary"
    "fmt"
    "log"
)

func main() {
    var src cryptoSource
    rnd := rand.New(src)

    // действительно случайное число от 0 до 999
    fmt.Println(rnd.Intn(1000)) 
}

type cryptoSource struct{}

func (s cryptoSource) Seed(seed int64) {}

func (s cryptoSource) Int63() int64 {
    return int64(s.Uint64() & ^uint64(1<<63))
}

func (s cryptoSource) Uint64() (v uint64) {
    err := binary.Read(crand.Reader, binary.BigEndian, &v)
    if err != nil {
        log.Fatal(err)
    }
    return v
}

Предупреждение: crand.Reader возвращает ошибку в случае сбоя основного системного вызова. Например, если он не может прочитать /dev/urandom в системе Unix, или если CryptAcquireContext не работает в системе Windows.


Читайте также: