rpc: opt NewID

This commit is contained in:
cuiweixie 2025-07-31 12:52:00 +08:00
parent 4997a248ab
commit 49a6eaa6d4

View file

@ -24,7 +24,7 @@ import (
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"errors" "errors"
"math/rand" "math/rand/v2"
"reflect" "reflect"
"strings" "strings"
"sync" "sync"
@ -59,23 +59,28 @@ func NewID() ID {
// randomIDGenerator returns a function generates a random IDs. // randomIDGenerator returns a function generates a random IDs.
func randomIDGenerator() func() ID { func randomIDGenerator() func() ID {
var buf = make([]byte, 8) var buf = make([]byte, 16)
var seed int64 var seed1, seed2 uint64
if _, err := crand.Read(buf); err == nil { if _, err := crand.Read(buf); err == nil {
seed = int64(binary.BigEndian.Uint64(buf)) seed1 = binary.BigEndian.Uint64(buf[:8])
seed2 = binary.BigEndian.Uint64(buf[8:])
} else { } else {
seed = int64(time.Now().Nanosecond()) seed1 = uint64(time.Now().Nanosecond())
seed2 = uint64(time.Now().Nanosecond())
} }
var ( var (
mu sync.Mutex mu sync.Mutex
rng = rand.New(rand.NewSource(seed)) rng = rand.New(rand.NewPCG(seed1, seed2))
) )
return func() ID { return func() ID {
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
id := make([]byte, 16) id := make([]byte, 16)
rng.Read(id) idPart0 := rng.Uint64()
idPart1 := rng.Uint64()
binary.BigEndian.PutUint64(id[:8], idPart0)
binary.BigEndian.PutUint64(id[8:], idPart1)
return encodeID(id) return encodeID(id)
} }
} }