tools.aw_id

Yohn Y. 2026-01-02 Parent:74721178aed9

15:041713361fca Go to Latest

tools.aw_id/src/main.go

+ Новая версия автоматического идентификатора для систем с убогим режимом сортировки (Windows), когда не возможно нормально отсортировать то, что идёт в цифробуквенной кодировке.

History
1 // devel.a0fs.ru -- aw_id -- v1.r202601.1 //
2 /*
3 Утилиты генерирования полезных в работе ID
4 */
5 package main
7 import (
8 "fmt"
9 "os"
10 "time"
12 "strconv"
14 "github.com/google/uuid"
15 "github.com/oleg-vasiliev/uuid7"
16 )
18 const (
19 TIME_ID = iota
20 TIME_HUM
21 TIME_HUM_RU
22 TIME_HUM_SAFE
23 TIME_HUM_SAFE2
24 TIME_ID_SHORT
25 TIME_ID_SHORT2
26 )
28 func get_time_id(id_type int) string {
29 cur_time := time.Now()
30 var time_format string = time.RFC3339
32 switch id_type {
33 case TIME_ID:
34 time_format = "20060102-150405"
35 case TIME_HUM_RU:
36 time_format = "02.01.2006 15:04:05"
37 case TIME_HUM:
38 time_format = "2006-01-02 15:04:05"
39 case TIME_HUM_SAFE:
40 time_format = "2006-01-02 15-04-05"
41 case TIME_HUM_SAFE2:
42 time_format = "2006-01-02_15-04-05"
43 case TIME_ID_SHORT:
44 time_format = "20060102"
45 case TIME_ID_SHORT2:
46 time_format = "200601"
47 }
49 return cur_time.Format(time_format)
50 }
52 func get_uuid() string {
53 res := uuid.New()
54 return res.String()
55 }
57 func get_uuid7() string {
58 res, err := uuid7.New()
60 if err != nil {
61 return "00000000-0000-0000-0000-000000000000"
63 } else {
64 return res.String()
66 }
67 }
69 func get_ver_id() string {
70 return fmt.Sprintf("v0.r%s.1", get_time_id(TIME_ID_SHORT2))
71 }
73 func get_ver_id2() string {
74 return fmt.Sprintf("0.%s.1", get_time_id(TIME_ID_SHORT2))
75 }
77 func str2uint(s string) uint64 {
78 res, err := strconv.ParseUint(s, 10, 64)
79 if err != nil {
80 panic(fmt.Sprintf("Error in parsing '%s': %v\n", s, err))
81 }
83 return res
84 }
86 func get_cmprs_ts(c_time time.Time) uint64 {
87 var res uint64
88 res = str2uint(c_time.Format("02")) << 17
89 res += str2uint(c_time.Format("15")) << 12
90 res += str2uint(c_time.Format("04")) << 6
91 res += str2uint(c_time.Format("05"))
93 return res
94 }
96 func get_ver_auto_tag(is_num bool) string {
97 const CDB uint64 = 62
98 var auto_version []byte = []byte{
99 '0', '0', '0',
100 '0', '0', '0'}
102 var CD [CDB]byte = [CDB]byte{'0', '1', '2', '3', '4', '5', '6',
103 '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
104 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
105 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
106 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
107 't', 'u', 'v', 'w', 'x', 'y', 'z'}
109 var buf_u64 uint64
111 buf_time := time.Now()
112 if !is_num {
113 var buf_u64_idx uint64
114 var ar_idx uint = 5
116 buf_u64 = get_cmprs_ts(buf_time)
117 buf_u64 = buf_u64*uint64(100) + uint64(buf_time.Nanosecond()/10000000)
119 for buf_u64 >= CDB && ar_idx > 0 {
120 buf_u64_idx = buf_u64 % CDB
121 buf_u64 /= CDB
122 auto_version[ar_idx] = CD[buf_u64_idx]
123 ar_idx--
126 if buf_u64 >= CDB {
127 panic(fmt.Sprintf("get_ver_auto_tag: Need more size in buffer, value %v > %v", buf_u64, CDB))
129 } else {
130 auto_version[ar_idx] = CD[buf_u64]
133 return string(auto_version)
135 } else {
136 buf_u64 = get_cmprs_ts(buf_time) << 3
137 buf_u64 += uint64(buf_time.Nanosecond()) >> 27
139 return fmt.Sprintf("%v", buf_u64)
143 func get_ver_id3() string {
144 return fmt.Sprintf("v0.r%s.%s", get_time_id(TIME_ID_SHORT2), get_ver_auto_tag(false))
147 func get_ver_id4() string {
148 return fmt.Sprintf("0.%s.%s", get_time_id(TIME_ID_SHORT2), get_ver_auto_tag(false))
151 func get_ver_id4_n() string {
152 return fmt.Sprintf("0.%s.%s", get_time_id(TIME_ID_SHORT2), get_ver_auto_tag(true))
155 func get_ver_id4_s() string {
156 return fmt.Sprintf("%s.%s", get_time_id(TIME_ID_SHORT2), get_ver_auto_tag(false))
159 func get_ver_id4_s_n() string {
160 return fmt.Sprintf("%s.%s", get_time_id(TIME_ID_SHORT2), get_ver_auto_tag(true))
163 func prnt_out(k, v string) {
164 fmt.Printf("%10s : %s\n", k, v)
167 func make_all_ids() {
168 prnt_out("uuid", get_uuid())
169 prnt_out("uuid7", get_uuid7())
170 prnt_out("ts", get_time_id(TIME_ID))
171 prnt_out("tss", get_time_id(TIME_ID_SHORT))
172 prnt_out("tss2", get_time_id(TIME_ID_SHORT2))
173 prnt_out("hr", get_time_id(TIME_HUM))
174 prnt_out("hrr", get_time_id(TIME_HUM_RU))
175 prnt_out("hrs", get_time_id(TIME_HUM_SAFE))
176 prnt_out("hrs2", get_time_id(TIME_HUM_SAFE2))
177 prnt_out("v", get_ver_id())
178 prnt_out("va", get_ver_id3())
179 prnt_out("vs", get_ver_id2())
180 prnt_out("vsa", get_ver_id4())
181 prnt_out("vsa2", get_ver_id4_n())
182 prnt_out("vssa", get_ver_id4_s())
183 prnt_out("vssa2", get_ver_id4_s_n())
184 fmt.Println("")
187 func main() {
188 if len(os.Args) > 1 {
189 switch os.Args[1] {
190 case "uuid":
191 fmt.Println(get_uuid())
192 case "uuid7":
193 fmt.Println(get_uuid7())
194 case "ts":
195 fmt.Println(get_time_id(TIME_ID))
196 case "hr":
197 fmt.Println(get_time_id(TIME_HUM))
198 case "hrr":
199 fmt.Println(get_time_id(TIME_HUM_RU))
200 case "hrs":
201 fmt.Println(get_time_id(TIME_HUM_SAFE))
202 case "hrs2":
203 fmt.Println(get_time_id(TIME_HUM_SAFE2))
204 case "tss":
205 fmt.Println(get_time_id(TIME_ID_SHORT))
206 case "tss2":
207 fmt.Println(get_time_id(TIME_ID_SHORT2))
208 case "v":
209 fmt.Println(get_ver_id())
210 case "va":
211 fmt.Println(get_ver_id3())
212 case "vs":
213 fmt.Println(get_ver_id2())
214 case "vsa":
215 fmt.Println(get_ver_id4())
216 case "vsa2":
217 fmt.Println(get_ver_id4_n())
218 case "vssa":
219 fmt.Println(get_ver_id4_s())
220 case "vssa2":
221 fmt.Println(get_ver_id4_s_n())
222 default:
223 fmt.Println("Need one of: ")
224 fmt.Println(" uuid, uuid7, ts, tss, tss2, hr, hrr, hrs, hrs2,")
225 fmt.Println(" v, va, vs, vsa, vsa2, vssa, vssa2")
227 fmt.Println("")
228 } else {
229 make_all_ids()