Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/vendor/github.com/google/uuid/version6.go
2875 views
1
// Copyright 2023 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 "encoding/binary"
8
9
// UUID version 6 is a field-compatible version of UUIDv1, reordered for improved DB locality.
10
// It is expected that UUIDv6 will primarily be used in contexts where there are existing v1 UUIDs.
11
// Systems that do not involve legacy UUIDv1 SHOULD consider using UUIDv7 instead.
12
//
13
// see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#uuidv6
14
//
15
// NewV6 returns a Version 6 UUID based on the current NodeID and clock
16
// sequence, and the current time. If the NodeID has not been set by SetNodeID
17
// or SetNodeInterface then it will be set automatically. If the NodeID cannot
18
// be set NewV6 set NodeID is random bits automatically . If clock sequence has not been set by
19
// SetClockSequence then it will be set automatically. If GetTime fails to
20
// return the current NewV6 returns Nil and an error.
21
func NewV6() (UUID, error) {
22
var uuid UUID
23
now, seq, err := GetTime()
24
if err != nil {
25
return uuid, err
26
}
27
28
/*
29
0 1 2 3
30
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32
| time_high |
33
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34
| time_mid | time_low_and_version |
35
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36
|clk_seq_hi_res | clk_seq_low | node (0-1) |
37
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38
| node (2-5) |
39
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40
*/
41
42
binary.BigEndian.PutUint64(uuid[0:], uint64(now))
43
binary.BigEndian.PutUint16(uuid[8:], seq)
44
45
uuid[6] = 0x60 | (uuid[6] & 0x0F)
46
uuid[8] = 0x80 | (uuid[8] & 0x3F)
47
48
nodeMu.Lock()
49
if nodeID == zeroID {
50
setNodeInterface("")
51
}
52
copy(uuid[10:], nodeID[:])
53
nodeMu.Unlock()
54
55
return uuid, nil
56
}
57
58