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
 | |
| }
 | |
| 
 |