Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.9 KiB
81 lines
1.9 KiB
package uuid |
|
|
|
/**************** |
|
* Date: 14/02/14 |
|
* Time: 7:46 PM |
|
***************/ |
|
|
|
import ( |
|
"time" |
|
) |
|
|
|
const ( |
|
// A tick is 100 ns |
|
ticksPerSecond = 10000000 |
|
|
|
// Difference between |
|
gregorianToUNIXOffset uint64 = 0x01B21DD213814000 |
|
|
|
// set the following to the number of 100ns ticks of the actual |
|
// resolution of your system's clock |
|
idsPerTimestamp = 1024 |
|
) |
|
|
|
var ( |
|
lastTimestamp Timestamp |
|
idsThisTimestamp = idsPerTimestamp |
|
) |
|
|
|
// ********************************************** Timestamp |
|
|
|
type Timestamp uint64 |
|
|
|
// TODO Create c version same as package runtime and time |
|
func Now() (sec int64, nsec int32) { |
|
t := time.Now() |
|
sec = t.Unix() |
|
nsec = int32(t.Nanosecond()) |
|
return |
|
} |
|
|
|
// Converts Unix formatted time to RFC4122 UUID formatted times |
|
// UUID UTC base time is October 15, 1582. |
|
// Unix base time is January 1, 1970. |
|
// Converts time to 100 nanosecond ticks since epoch |
|
// There are 1000000000 nanoseconds in a second, |
|
// 1000000000 / 100 = 10000000 tiks per second |
|
func timestamp() Timestamp { |
|
sec, nsec := Now() |
|
return Timestamp(uint64(sec)*ticksPerSecond + |
|
uint64(nsec)/100 + gregorianToUNIXOffset) |
|
} |
|
|
|
func (o Timestamp) Unix() time.Time { |
|
t := uint64(o) - gregorianToUNIXOffset |
|
return time.Unix(0, int64(t*100)) |
|
} |
|
|
|
// Get time as 60-bit 100ns ticks since UUID epoch. |
|
// Compensate for the fact that real clock resolution is |
|
// less than 100ns. |
|
func currentUUIDTimestamp() Timestamp { |
|
var timeNow Timestamp |
|
for { |
|
timeNow = timestamp() |
|
|
|
// if clock reading changed since last UUID generated |
|
if lastTimestamp != timeNow { |
|
// reset count of UUIDs with this timestamp |
|
idsThisTimestamp = 0 |
|
lastTimestamp = timeNow |
|
break |
|
} |
|
if idsThisTimestamp < idsPerTimestamp { |
|
idsThisTimestamp++ |
|
break |
|
} |
|
// going too fast for the clock; spin |
|
} |
|
// add the count of UUIDs to low order bits of the clock reading |
|
return timeNow + Timestamp(idsThisTimestamp) |
|
}
|
|
|