OSDN Git Service

merge with the dev
[bytom/bytom.git] / blockchain / signers / idgenerate.go
1 package signers
2
3 import (
4         "encoding/binary"
5         "github.com/bytom/encoding/base32"
6         "sync/atomic"
7         "time"
8 )
9
10 //1<seq_id ,increase by 1
11 var seq_id uint32 = 0
12
13 func next_seq_id() uint32 {
14
15         atomic.AddUint32(&seq_id, 1)
16
17         return (seq_id)
18 }
19
20 // see the SQL function next_cahin_id in schema.sql on https://github.com/chain/chain
21 func Idgenerate(prefix string) (string, uint64) {
22         var our_epoch_ms uint64 = 1496635208000
23         var n uint64
24
25         now_ms := uint64(time.Now().UnixNano() / 1e6)
26         seq_index := uint64(next_seq_id())
27         seq_id := uint64(seq_index % 1024)
28         shard_id := uint64(5)
29
30         n = (now_ms - our_epoch_ms) << 23
31         n = n | (shard_id << 10)
32         n = n | seq_id
33
34         bin := make([]byte, 8)
35         binary.BigEndian.PutUint64(bin, n)
36         encodestring := base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(bin)
37
38         return prefix + encodestring, seq_index
39
40 }