diff --git a/generator.go b/generator.go index b1833a0..3f2f1da 100644 --- a/generator.go +++ b/generator.go @@ -107,7 +107,7 @@ func (g *generator) NewV1() UUID { copy(u[10:], hardwareAddr) u.SetVersion(V1) - u.SetVariant() + u.SetVariant(VariantRFC4122) return u } @@ -133,7 +133,7 @@ func (g *generator) NewV2(domain byte) UUID { copy(u[10:], hardwareAddr) u.SetVersion(V2) - u.SetVariant() + u.SetVariant(VariantRFC4122) return u } @@ -142,7 +142,7 @@ func (g *generator) NewV2(domain byte) UUID { func (g *generator) NewV3(ns UUID, name string) UUID { u := newFromHash(md5.New(), ns, name) u.SetVersion(V3) - u.SetVariant() + u.SetVariant(VariantRFC4122) return u } @@ -152,7 +152,7 @@ func (g *generator) NewV4() UUID { u := UUID{} g.safeRandom(u[:]) u.SetVersion(V4) - u.SetVariant() + u.SetVariant(VariantRFC4122) return u } @@ -161,7 +161,7 @@ func (g *generator) NewV4() UUID { func (g *generator) NewV5(ns UUID, name string) UUID { u := newFromHash(sha1.New(), ns, name) u.SetVersion(V5) - u.SetVariant() + u.SetVariant(VariantRFC4122) return u } diff --git a/uuid.go b/uuid.go index 62e127b..a2b8e2c 100644 --- a/uuid.go +++ b/uuid.go @@ -92,14 +92,17 @@ func (u UUID) Version() byte { // Variant returns UUID layout variant. func (u UUID) Variant() byte { switch { - case (u[8] & 0x80) == 0x00: + case (u[8] >> 7) == 0x00: return VariantNCS - case (u[8]&0xc0)|0x80 == 0x80: + case (u[8] >> 6) == 0x02: return VariantRFC4122 - case (u[8]&0xe0)|0xc0 == 0xc0: + case (u[8] >> 5) == 0x06: return VariantMicrosoft + case (u[8] >> 5) == 0x07: + fallthrough + default: + return VariantFuture } - return VariantFuture } // Bytes returns bytes slice representation of UUID. @@ -130,9 +133,20 @@ func (u *UUID) SetVersion(v byte) { u[6] = (u[6] & 0x0f) | (v << 4) } -// SetVariant sets variant bits as described in RFC 4122. -func (u *UUID) SetVariant() { - u[8] = (u[8] & 0xbf) | 0x80 +// SetVariant sets variant bits. +func (u *UUID) SetVariant(v byte) { + switch v { + case VariantNCS: + u[8] = (u[8]&(0xff>>1) | (0x00 << 7)) + case VariantRFC4122: + u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) + case VariantMicrosoft: + u[8] = (u[8]&(0xff>>3) | (0x06 << 5)) + case VariantFuture: + fallthrough + default: + u[8] = (u[8]&(0xff>>3) | (0x07 << 5)) + } } // Must is a helper that wraps a call to a function returning (UUID, error) diff --git a/uuid_test.go b/uuid_test.go index 6ae0079..beb336d 100644 --- a/uuid_test.go +++ b/uuid_test.go @@ -79,6 +79,12 @@ func (s *testSuite) TestVariant(c *C) { func (s *testSuite) TestSetVariant(c *C) { u := UUID{} - u.SetVariant() + u.SetVariant(VariantNCS) + c.Assert(u.Variant(), Equals, VariantNCS) + u.SetVariant(VariantRFC4122) c.Assert(u.Variant(), Equals, VariantRFC4122) + u.SetVariant(VariantMicrosoft) + c.Assert(u.Variant(), Equals, VariantMicrosoft) + u.SetVariant(VariantFuture) + c.Assert(u.Variant(), Equals, VariantFuture) }