tools.aw_id

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

15:041713361fca Go to Latest

tools.aw_id/src/main.go

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

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