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  }