github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/blockchain/signers/idgenerate.go (about) 1 package signers 2 3 import ( 4 "encoding/binary" 5 "sync/atomic" 6 "time" 7 8 "github.com/bytom/bytom/encoding/base32" 9 ) 10 11 //1<seq_id ,increase by 1 12 var seqID uint32 13 14 func nextSeqID() uint32 { 15 16 atomic.AddUint32(&seqID, 1) 17 18 return seqID 19 } 20 21 //IDGenerate generate signer unique id 22 func IDGenerate() string { 23 var ourEpochMS uint64 = 1496635208000 24 var n uint64 25 26 nowMS := uint64(time.Now().UnixNano() / 1e6) 27 seqIndex := uint64(nextSeqID()) 28 seqID := uint64(seqIndex % 1024) 29 shardID := uint64(5) 30 31 n = (nowMS - ourEpochMS) << 23 32 n = n | (shardID << 10) 33 n = n | seqID 34 35 bin := make([]byte, 8) 36 binary.BigEndian.PutUint64(bin, n) 37 encodeString := base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(bin) 38 39 return encodeString 40 41 }