Source File
version7.go
Belonging Package
github.com/google/uuid
// Copyright 2023 Google Inc. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package uuidimport ()// UUID version 7 features a time-ordered value field derived from the widely// implemented and well known Unix Epoch timestamp source,// the number of milliseconds seconds since midnight 1 Jan 1970 UTC, leap seconds excluded.// As well as improved entropy characteristics over versions 1 or 6.//// see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#name-uuid-version-7//// Implementations SHOULD utilize UUID version 7 over UUID version 1 and 6 if possible.//// NewV7 returns a Version 7 UUID based on the current time(Unix Epoch).// Uses the randomness pool if it was enabled with EnableRandPool.// On error, NewV7 returns Nil and an errorfunc () (UUID, error) {, := NewRandom()if != nil {return ,}makeV7([:])return , nil}// NewV7FromReader returns a Version 7 UUID based on the current time(Unix Epoch).// it use NewRandomFromReader fill random bits.// On error, NewV7FromReader returns Nil and an error.func ( io.Reader) (UUID, error) {, := NewRandomFromReader()if != nil {return ,}makeV7([:])return , nil}// makeV7 fill 48 bits time (uuid[0] - uuid[5]), set version b0111 (uuid[6])// uuid[8] already has the right version number (Variant is 10)// see function NewV7 and NewV7FromReaderfunc makeV7( []byte) {/*0 1 2 30 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| unix_ts_ms |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| unix_ts_ms | ver | rand_a (12 bit seq) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|var| rand_b |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| rand_b |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/_ = [15] // bounds check, := getV7Time()[0] = byte( >> 40)[1] = byte( >> 32)[2] = byte( >> 24)[3] = byte( >> 16)[4] = byte( >> 8)[5] = byte()[6] = 0x70 | (0x0F & byte(>>8))[7] = byte()}// lastV7time is the last time we returned stored as://// 52 bits of time in milliseconds since epoch// 12 bits of (fractional nanoseconds) >> 8var lastV7time int64const nanoPerMilli = 1000000// getV7Time returns the time in milliseconds and nanoseconds / 256.// The returned (milli << 12 + seq) is guarenteed to be greater than// (milli << 12 + seq) returned by any previous call to getV7Time.func getV7Time() (, int64) {timeMu.Lock()defer timeMu.Unlock():= timeNow().UnixNano()= / nanoPerMilli// Sequence number is between 0 and 3906 (nanoPerMilli>>8)= ( - *nanoPerMilli) >> 8:= <<12 +if <= lastV7time {= lastV7time + 1= >> 12= & 0xfff}lastV7time =return ,}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |