-
Notifications
You must be signed in to change notification settings - Fork 2
/
util.go
99 lines (88 loc) · 1.71 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package xweb
import (
"crypto/rand"
"fmt"
"math"
"math/big"
"os"
"strconv"
"sync"
"time"
"github.com/cxuhua/xweb/now"
)
// 获取当前时间
func TimeNow() string {
return time.Now().Format("2006-01-02 15:04:05")
}
// 获取一天的开始时间
func ZeroTime() time.Time {
return now.BeginningOfDay()
}
// 随机获取0-9数字,l为长度
func RandNumber(l int) string {
max := big.NewInt(10)
ret := ""
for i := 0; i < l; i++ {
r, err := rand.Int(rand.Reader, max)
if err != nil {
panic(err)
}
ret += fmt.Sprintf("%d", r.Uint64())
}
return ret
}
var (
idlck = sync.Mutex{}
icv = uint32(0)
pcv = uint32(0)
pid = os.Getpid()
)
func fixInc(num uint32, max int) (uint32, int) {
org := int(math.Log10(float64(num)) + 1)
if org > max {
org = max
}
ret := num % uint32(math.Pow10(org))
if ret <= 0 {
ret = 1
}
bits := math.Log10(float64(ret)) + 1
return ret, int(bits)
}
func fixPid(pid int, num int) uint {
p := float64(pid)
n := int(math.Log10(p)) + 1
return uint(pid%int(math.Pow10(num)) + int(math.Pow10(num)*float64(n)))
}
func fixNum(pid int, num uint32) uint64 {
inc, bit := fixInc(num, 5)
np := fixPid(pid, 7-bit)
return uint64(float64(np)*math.Pow10(bit)) + uint64(inc)
}
// 创建一个guid
func GenId() string {
idlck.Lock()
defer idlck.Unlock()
t := time.Now()
hour, min, sec := t.Clock()
z := uint32(hour*60*60 + min*60 + sec)
if pcv == 0 {
pcv = z
} else if pcv != z {
icv = 0
pcv = z
}
icv++
i := icv % 100000000
s1 := fmt.Sprintf("%.8d", fixNum(pid, i))
s2 := fmt.Sprintf("%.5d", z)
return t.Format("060102") + s2 + s1
}
func GenUInt64() uint64 {
id := GenId()
num, err := strconv.ParseUint(id, 10, 64)
if err != nil {
panic(err)
}
return num
}