@@ -10,9 +10,12 @@ import (
1010 "time"
1111)
1212
13+ const encodeStr = "123456789abcdefghijklmnpqrstuvxy"
14+
1315var (
14- seq uint32
15- buf = make ([]byte , 14 )
16+ seq uint32
17+ initBuf = make ([]byte , 14 )
18+ encoding = base32 .NewEncoding (encodeStr ).WithPadding (base32 .NoPadding )
1619)
1720
1821func init () {
@@ -22,29 +25,30 @@ func init() {
2225 if ! i .IP .IsLoopback () {
2326 i4 := i .IP .To4 ()
2427 if len (i4 ) == net .IPv4len {
25- buf [4 ] = i .IP .To4 ()[0 ]
26- buf [5 ] = i .IP .To4 ()[1 ]
27- buf [6 ] = i .IP .To4 ()[2 ]
28- buf [7 ] = i .IP .To4 ()[3 ]
28+ initBuf [4 ] = i .IP .To4 ()[0 ]
29+ initBuf [5 ] = i .IP .To4 ()[1 ]
30+ initBuf [6 ] = i .IP .To4 ()[2 ]
31+ initBuf [7 ] = i .IP .To4 ()[3 ]
2932 break
3033 }
3134 }
3235 }
3336 }
34- binary .LittleEndian .PutUint16 (buf [8 :], uint16 (os .Getpid ()))
37+ binary .LittleEndian .PutUint16 (initBuf [8 :], uint16 (os .Getpid ()))
3538}
3639
3740//String 生成字符串的uuid
3841func String () string {
42+ buf := initBuf [:]
3943 binary .BigEndian .PutUint32 (buf [0 :], uint32 (time .Now ().UTC ().Unix ()))
4044 binary .BigEndian .PutUint32 (buf [10 :], atomic .AddUint32 (& seq , 1 ))
41- return base32 . HexEncoding . WithPadding ( base32 . NoPadding ) .EncodeToString (buf )
45+ return encoding .EncodeToString (buf )
4246}
4347
4448//Decode 解析uuid字符串,返回具体细节.
4549func Decode (s string ) (ip string , pid int , tm time.Time , seq uint32 , err error ) {
4650 var buf []byte
47- buf , err = base32 . HexEncoding . WithPadding ( base32 . NoPadding ) .DecodeString (s )
51+ buf , err = encoding .DecodeString (s )
4852 if err != nil {
4953 return
5054 }
0 commit comments