Платформа ЦРНП "Мирокод" для разработки проектов
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.
103 lines
2.8 KiB
103 lines
2.8 KiB
package uuid |
|
|
|
/**************** |
|
* Date: 31/01/14 |
|
* Time: 3:34 PM |
|
***************/ |
|
|
|
import "net" |
|
|
|
// Struct is used for RFC4122 Version 1 UUIDs |
|
type Struct struct { |
|
timeLow uint32 |
|
timeMid uint16 |
|
timeHiAndVersion uint16 |
|
sequenceHiAndVariant byte |
|
sequenceLow byte |
|
node []byte |
|
size int |
|
} |
|
|
|
func (o Struct) Size() int { |
|
return o.size |
|
} |
|
|
|
func (o Struct) Version() int { |
|
return int(o.timeHiAndVersion >> 12) |
|
} |
|
|
|
func (o Struct) Variant() byte { |
|
return variant(o.sequenceHiAndVariant) |
|
} |
|
|
|
// Sets the four most significant bits (bits 12 through 15) of the |
|
// timeHiAndVersion field to the 4-bit version number. |
|
func (o *Struct) setVersion(pVersion int) { |
|
o.timeHiAndVersion &= 0x0FFF |
|
o.timeHiAndVersion |= (uint16(pVersion) << 12) |
|
} |
|
|
|
func (o *Struct) setVariant(pVariant byte) { |
|
setVariant(&o.sequenceHiAndVariant, pVariant) |
|
} |
|
|
|
func (o *Struct) Unmarshal(pData []byte) { |
|
o.timeLow = uint32(pData[3]) | uint32(pData[2])<<8 | uint32(pData[1])<<16 | uint32(pData[0])<<24 |
|
o.timeMid = uint16(pData[5]) | uint16(pData[4])<<8 |
|
o.timeHiAndVersion = uint16(pData[7]) | uint16(pData[6])<<8 |
|
o.sequenceHiAndVariant = pData[8] |
|
o.sequenceLow = pData[9] |
|
o.node = pData[10:o.Size()] |
|
} |
|
|
|
func (o *Struct) Bytes() (data []byte) { |
|
data = []byte{ |
|
byte(o.timeLow >> 24), byte(o.timeLow >> 16), byte(o.timeLow >> 8), byte(o.timeLow), |
|
byte(o.timeMid >> 8), byte(o.timeMid), |
|
byte(o.timeHiAndVersion >> 8), byte(o.timeHiAndVersion), |
|
} |
|
data = append(data, o.sequenceHiAndVariant) |
|
data = append(data, o.sequenceLow) |
|
data = append(data, o.node...) |
|
return |
|
} |
|
|
|
// Marshals the UUID bytes into a slice |
|
func (o *Struct) MarshalBinary() ([]byte, error) { |
|
return o.Bytes(), nil |
|
} |
|
|
|
// Un-marshals the data bytes into the UUID struct. |
|
// Implements the BinaryUn-marshaller interface |
|
func (o *Struct) UnmarshalBinary(pData []byte) error { |
|
return UnmarshalBinary(o, pData) |
|
} |
|
|
|
func (o Struct) String() string { |
|
return formatter(&o, format) |
|
} |
|
|
|
func (o Struct) Format(pFormat string) string { |
|
return formatter(&o, pFormat) |
|
} |
|
|
|
// Set the three most significant bits (bits 0, 1 and 2) of the |
|
// sequenceHiAndVariant to variant mask 0x80. |
|
func (o *Struct) setRFC4122Variant() { |
|
o.sequenceHiAndVariant &= variantSet |
|
o.sequenceHiAndVariant |= ReservedRFC4122 |
|
} |
|
|
|
// Unmarshals data into struct for V1 UUIDs |
|
func newV1(pNow Timestamp, pVersion uint16, pVariant byte, pNode net.HardwareAddr) UUID { |
|
o := new(Struct) |
|
o.timeLow = uint32(pNow & 0xFFFFFFFF) |
|
o.timeMid = uint16((pNow >> 32) & 0xFFFF) |
|
o.timeHiAndVersion = uint16((pNow >> 48) & 0x0FFF) |
|
o.timeHiAndVersion |= uint16(pVersion << 12) |
|
o.sequenceLow = byte(state.sequence & 0xFF) |
|
o.sequenceHiAndVariant = byte((state.sequence & 0x3F00) >> 8) |
|
o.sequenceHiAndVariant |= pVariant |
|
o.node = pNode |
|
return o |
|
}
|
|
|