podman

Форк
0
76 строк · 2.0 Кб
1
// Copyright 2016 Google Inc.  All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4

5
package uuid
6

7
import "io"
8

9
// New creates a new random UUID or panics.  New is equivalent to
10
// the expression
11
//
12
//    uuid.Must(uuid.NewRandom())
13
func New() UUID {
14
	return Must(NewRandom())
15
}
16

17
// NewString creates a new random UUID and returns it as a string or panics.
18
// NewString is equivalent to the expression
19
//
20
//    uuid.New().String()
21
func NewString() string {
22
	return Must(NewRandom()).String()
23
}
24

25
// NewRandom returns a Random (Version 4) UUID.
26
//
27
// The strength of the UUIDs is based on the strength of the crypto/rand
28
// package.
29
//
30
// Uses the randomness pool if it was enabled with EnableRandPool.
31
//
32
// A note about uniqueness derived from the UUID Wikipedia entry:
33
//
34
//  Randomly generated UUIDs have 122 random bits.  One's annual risk of being
35
//  hit by a meteorite is estimated to be one chance in 17 billion, that
36
//  means the probability is about 0.00000000006 (6 × 10−11),
37
//  equivalent to the odds of creating a few tens of trillions of UUIDs in a
38
//  year and having one duplicate.
39
func NewRandom() (UUID, error) {
40
	if !poolEnabled {
41
		return NewRandomFromReader(rander)
42
	}
43
	return newRandomFromPool()
44
}
45

46
// NewRandomFromReader returns a UUID based on bytes read from a given io.Reader.
47
func NewRandomFromReader(r io.Reader) (UUID, error) {
48
	var uuid UUID
49
	_, err := io.ReadFull(r, uuid[:])
50
	if err != nil {
51
		return Nil, err
52
	}
53
	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
54
	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
55
	return uuid, nil
56
}
57

58
func newRandomFromPool() (UUID, error) {
59
	var uuid UUID
60
	poolMu.Lock()
61
	if poolPos == randPoolSize {
62
		_, err := io.ReadFull(rander, pool[:])
63
		if err != nil {
64
			poolMu.Unlock()
65
			return Nil, err
66
		}
67
		poolPos = 0
68
	}
69
	copy(uuid[:], pool[poolPos:(poolPos+16)])
70
	poolPos += 16
71
	poolMu.Unlock()
72

73
	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
74
	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
75
	return uuid, nil
76
}
77

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.