parent
3e091eb71b
commit
e69ffba5ae
@ -0,0 +1,40 @@
|
||||
// Package uid generates unique IDs.
|
||||
package uid
|
||||
|
||||
import (
|
||||
"github.com/speps/go-hashids"
|
||||
"go.uber.org/atomic"
|
||||
)
|
||||
|
||||
// Generator generates unique incrementing IDs. These IDs are only comparable
|
||||
// with other IDs from this generator.
|
||||
type Generator struct {
|
||||
hid *hashids.HashID
|
||||
next atomic.Int64
|
||||
}
|
||||
|
||||
// NewGenerator creates a new Generator with the specified salt. Generators
|
||||
// with the same salt generate the same IDs in order.
|
||||
func NewGenerator(salt string) *Generator {
|
||||
hd := hashids.NewData()
|
||||
hd.MinLength = 8
|
||||
hd.Salt = salt
|
||||
hid, err := hashids.NewWithData(hd)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return &Generator{
|
||||
hid: hid,
|
||||
}
|
||||
}
|
||||
|
||||
// Next gets the next ID, in both an encoded string form and the raw integer form.
|
||||
func (g *Generator) Next() (string, int64) {
|
||||
v := g.next.Inc()
|
||||
id, err := g.hid.EncodeInt64([]int64{v})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return id, v
|
||||
}
|
Loading…
Reference in new issue