2018-05-14 16:26:38 +00:00
|
|
|
package snowflake
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/rand"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/influxdata/influxdb/pkg/snowflake"
|
2018-05-16 15:32:39 +00:00
|
|
|
"github.com/influxdata/platform"
|
2018-05-14 16:26:38 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
}
|
|
|
|
|
2018-07-25 11:02:05 +00:00
|
|
|
// IDGenerator holds the ID generator.
|
2018-05-14 16:26:38 +00:00
|
|
|
type IDGenerator struct {
|
|
|
|
Generator *snowflake.Generator
|
|
|
|
}
|
|
|
|
|
2018-07-25 11:02:05 +00:00
|
|
|
// NewIDGenerator creates a new ID generator.
|
2018-05-14 16:26:38 +00:00
|
|
|
func NewIDGenerator() *IDGenerator {
|
|
|
|
return &IDGenerator{
|
|
|
|
// Maximum machine id is 1023
|
|
|
|
Generator: snowflake.New(rand.Intn(1023)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-25 11:02:05 +00:00
|
|
|
// ID returns a pointer to a generated ID.
|
2018-07-30 14:29:04 +00:00
|
|
|
func (g *IDGenerator) ID() platform.ID {
|
|
|
|
var id platform.ID
|
|
|
|
for {
|
|
|
|
id = platform.ID(g.Generator.Next())
|
|
|
|
if id.Valid() {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return id
|
2018-05-14 16:26:38 +00:00
|
|
|
}
|