tools.aw_id
2026-01-02
Parent:74721178aed9
tools.aw_id/src/main.go
+ Новая версия автоматического идентификатора для систем с убогим режимом сортировки (Windows), когда не возможно нормально отсортировать то, что идёт в цифробуквенной кодировке.
| 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 } |