diff --git a/client/client.go b/client/client.go index cdfdd5f..f7f5e9a 100644 --- a/client/client.go +++ b/client/client.go @@ -20,7 +20,7 @@ var ( ) func init() { - IdGen = NewObjectId() + IdGen = NewAutoIncId() } // Status handler diff --git a/client/id.go b/client/id.go index d597168..1afbaf0 100644 --- a/client/id.go +++ b/client/id.go @@ -1,35 +1,29 @@ package client import ( - "strconv" - "labix.org/v2/mgo/bson" - "github.com/mikespook/golib/autoinc" + "strconv" + "sync/atomic" + "time" ) type IdGenerator interface { - Id() string -} - -// ObjectId -type objectId struct {} - -func (id *objectId) Id() string { - return bson.NewObjectId().Hex() -} - -func NewObjectId() IdGenerator { - return &objectId{} + Id() string } // AutoIncId type autoincId struct { - *autoinc.AutoInc + value int64 } -func (id *autoincId) Id() string { - return strconv.Itoa(id.AutoInc.Id()) +func (ai *autoincId) Id() string { + next := atomic.AddInt64(&ai.value, 1) + return strconv.FormatInt(next, 10) } func NewAutoIncId() IdGenerator { - return &autoincId{autoinc.New(1, 1)} + // we'll consider the nano fraction of a second at startup unique + // and count up from there. + return &autoincId{ + value: int64(time.Now().Nanosecond()) << 32, + } } diff --git a/client/id_test.go b/client/id_test.go new file mode 100644 index 0000000..399d217 --- /dev/null +++ b/client/id_test.go @@ -0,0 +1,18 @@ +package client + +import ( + "testing" +) + +func TestAutoInc(t *testing.T) { + ai := NewAutoIncId() + + previous := ai.Id() + for i := 0; i < 10; i++ { + id := ai.Id() + if id == previous { + t.Errorf("Id not unique, previous and current %s", id) + } + previous = id + } +}