Linting, Optimizations, Cleanup, More Benchmarks.
This commit is contained in:
parent
0fdfe21511
commit
db0acce1d0
26
snowflake.go
26
snowflake.go
@ -3,24 +3,17 @@ package snowflake
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
timeBits = 41
|
nodeBits = 10
|
||||||
nodeBits = 10
|
stepBits = 12
|
||||||
stepBits = 12
|
nodeMax = -1 ^ (-1 << nodeBits)
|
||||||
|
stepMask int64 = -1 ^ (-1 << stepBits)
|
||||||
timeMask int64 = -1 ^ (-1 << timeBits)
|
|
||||||
nodeMask int64 = -1 ^ (-1 << nodeBits)
|
|
||||||
stepMask int64 = -1 ^ (-1 << stepBits)
|
|
||||||
|
|
||||||
nodeMax = -1 ^ (-1 << nodeBits)
|
|
||||||
|
|
||||||
timeShift uint8 = nodeBits + stepBits
|
timeShift uint8 = nodeBits + stepBits
|
||||||
nodeShift uint8 = stepBits
|
nodeShift uint8 = stepBits
|
||||||
)
|
)
|
||||||
@ -47,7 +40,7 @@ type ID int64
|
|||||||
func NewNode(node int64) (*Node, error) {
|
func NewNode(node int64) (*Node, error) {
|
||||||
|
|
||||||
if node < 0 || node > nodeMax {
|
if node < 0 || node > nodeMax {
|
||||||
return nil, fmt.Errorf("Node number must be between 0 and 1023")
|
return nil, errors.New("Node number must be between 0 and 1024")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Node{
|
return &Node{
|
||||||
@ -92,7 +85,7 @@ func (f ID) Int64() int64 {
|
|||||||
|
|
||||||
// String returns a string of the snowflake ID
|
// String returns a string of the snowflake ID
|
||||||
func (f ID) String() string {
|
func (f ID) String() string {
|
||||||
return fmt.Sprintf("%d", f)
|
return strconv.FormatInt(int64(f), 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base2 returns a string base2 of the snowflake ID
|
// Base2 returns a string base2 of the snowflake ID
|
||||||
@ -130,7 +123,6 @@ func (f ID) Step() int64 {
|
|||||||
return int64(f) & 0x0000000000000FFF
|
return int64(f) & 0x0000000000000FFF
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON returns a json byte array string of the snowflake ID.
|
|
||||||
func (f ID) MarshalJSON() ([]byte, error) {
|
func (f ID) MarshalJSON() ([]byte, error) {
|
||||||
return []byte(`"` + f.String() + `"`), nil
|
return []byte(`"` + f.String() + `"`), nil
|
||||||
}
|
}
|
||||||
@ -138,13 +130,11 @@ func (f ID) MarshalJSON() ([]byte, error) {
|
|||||||
// UnmarshalJSON converts a json byte array of a snowflake ID into an ID type.
|
// UnmarshalJSON converts a json byte array of a snowflake ID into an ID type.
|
||||||
func (f *ID) UnmarshalJSON(b []byte) error {
|
func (f *ID) UnmarshalJSON(b []byte) error {
|
||||||
|
|
||||||
s := strings.Replace(string(b), `"`, ``, 2)
|
i, err := strconv.ParseInt(string(b[1:len(b)-1]), 10, 64)
|
||||||
i, err := strconv.ParseInt(s, 10, 64)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
*f = ID(i)
|
*f = ID(i)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,42 @@
|
|||||||
package snowflake
|
package snowflake
|
||||||
|
|
||||||
import (
|
import "testing"
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func BenchmarkGenerate(b *testing.B) {
|
func BenchmarkGenerate(b *testing.B) {
|
||||||
|
|
||||||
node, _ := NewNode(1)
|
node, _ := NewNode(1)
|
||||||
|
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
_, _ = node.Generate()
|
_, _ = node.Generate()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkUnmarshal(b *testing.B) {
|
||||||
|
|
||||||
|
node, _ := NewNode(1)
|
||||||
|
id, _ := node.Generate()
|
||||||
|
var id2 ID
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
id2.UnmarshalJSON(id.Bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkMarshal(b *testing.B) {
|
||||||
|
|
||||||
|
node, _ := NewNode(1)
|
||||||
|
id, _ := node.Generate()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
_, _ = id.MarshalJSON()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user