1 | /**
|
---|
2 | * @packageDocumentation
|
---|
3 | **/
|
---|
4 | export interface ShortUniqueIdRanges {
|
---|
5 | [k: string]: [number, number];
|
---|
6 | }
|
---|
7 | export interface ShortUniqueIdRangesMap {
|
---|
8 | [k: string]: ShortUniqueIdRanges;
|
---|
9 | }
|
---|
10 | export type ShortUniqueIdDefaultDictionaries = 'number' | 'alpha' | 'alpha_lower' | 'alpha_upper' | 'alphanum' | 'alphanum_lower' | 'alphanum_upper' | 'hex';
|
---|
11 | /**
|
---|
12 | * ```js
|
---|
13 | * {
|
---|
14 | * dictionary: ['z', 'a', 'p', 'h', 'o', 'd', ...],
|
---|
15 | * shuffle: false,
|
---|
16 | * debug: false,
|
---|
17 | * length: 6,
|
---|
18 | * }
|
---|
19 | * ```
|
---|
20 | * <br/>
|
---|
21 | * @see {@link DEFAULT_OPTIONS}
|
---|
22 | */
|
---|
23 | export interface ShortUniqueIdOptions {
|
---|
24 | /** User-defined character dictionary */
|
---|
25 | dictionary: string[] | ShortUniqueIdDefaultDictionaries;
|
---|
26 | /** If true, sequentialUUID use the dictionary in the given order */
|
---|
27 | shuffle: boolean;
|
---|
28 | /** If true the instance will console.log useful info */
|
---|
29 | debug: boolean;
|
---|
30 | /** From 1 to infinity, the length you wish your UUID to be */
|
---|
31 | length: number;
|
---|
32 | /** From 0 to infinity, the current value for the sequential UUID counter */
|
---|
33 | counter: number;
|
---|
34 | }
|
---|
35 | /**
|
---|
36 | * 6 was chosen as the default UUID length since for most cases
|
---|
37 | * it will be more than aptly suitable to provide millions of UUIDs
|
---|
38 | * with a very low probability of producing a duplicate UUID.
|
---|
39 | *
|
---|
40 | * For example, with a dictionary including digits from 0 to 9,
|
---|
41 | * as well as the alphabet from a to z both in UPPER and lower case,
|
---|
42 | * the probability of generating a duplicate in 1,000,000 rounds
|
---|
43 | * is ~0.00000002, or about 1 in 50,000,000.
|
---|
44 | */
|
---|
45 | export declare const DEFAULT_UUID_LENGTH: number;
|
---|
46 | export declare const DEFAULT_OPTIONS: ShortUniqueIdOptions;
|
---|
47 | /**
|
---|
48 | * Generate random or sequential UUID of any length.
|
---|
49 | *
|
---|
50 | * ### Use as module
|
---|
51 | *
|
---|
52 | * ```js
|
---|
53 | * // Deno (web module) Import
|
---|
54 | * import ShortUniqueId from 'https://cdn.jsdelivr.net/npm/short-unique-id@latest/src/index.ts';
|
---|
55 | *
|
---|
56 | * // ES6 / TypeScript Import
|
---|
57 | * import ShortUniqueId from 'short-unique-id';
|
---|
58 | *
|
---|
59 | * // or Node.js require
|
---|
60 | * const ShortUniqueId = require('short-unique-id');
|
---|
61 | *
|
---|
62 | * // Instantiate
|
---|
63 | * const uid = new ShortUniqueId();
|
---|
64 | *
|
---|
65 | * // Random UUID
|
---|
66 | * console.log(uid.rnd());
|
---|
67 | *
|
---|
68 | * // Sequential UUID
|
---|
69 | * console.log(uid.seq());
|
---|
70 | * ```
|
---|
71 | *
|
---|
72 | * ### Use in browser
|
---|
73 | *
|
---|
74 | * ```html
|
---|
75 | * <!-- Import -->
|
---|
76 | * <script src="https://cdn.jsdelivr.net/npm/short-unique-id@latest/dist/short-unique-id.min.js"></script>
|
---|
77 | *
|
---|
78 | * <!-- Usage -->
|
---|
79 | * <script>
|
---|
80 | * // Instantiate
|
---|
81 | * var uid = new ShortUniqueId();
|
---|
82 | *
|
---|
83 | * // Random UUID
|
---|
84 | * document.write(uid.rnd());
|
---|
85 | *
|
---|
86 | * // Sequential UUID
|
---|
87 | * document.write(uid.seq());
|
---|
88 | * </script>
|
---|
89 | * ```
|
---|
90 | *
|
---|
91 | * ### Options
|
---|
92 | *
|
---|
93 | * Options can be passed when instantiating `uid`:
|
---|
94 | *
|
---|
95 | * ```js
|
---|
96 | * const options = { ... };
|
---|
97 | *
|
---|
98 | * const uid = new ShortUniqueId(options);
|
---|
99 | * ```
|
---|
100 | *
|
---|
101 | * For more information take a look at the [ShortUniqueIdOptions type definition](/interfaces/shortuniqueidoptions.html).
|
---|
102 | */
|
---|
103 | export default class ShortUniqueId {
|
---|
104 | /** @hidden */
|
---|
105 | static default: typeof ShortUniqueId;
|
---|
106 | counter: number;
|
---|
107 | debug: boolean;
|
---|
108 | dict: string[];
|
---|
109 | version: string;
|
---|
110 | dictIndex: number;
|
---|
111 | dictRange: number[];
|
---|
112 | lowerBound: number;
|
---|
113 | upperBound: number;
|
---|
114 | dictLength: number;
|
---|
115 | uuidLength: number;
|
---|
116 | protected _digit_first_ascii: number;
|
---|
117 | protected _digit_last_ascii: number;
|
---|
118 | protected _alpha_lower_first_ascii: number;
|
---|
119 | protected _alpha_lower_last_ascii: number;
|
---|
120 | protected _hex_last_ascii: number;
|
---|
121 | protected _alpha_upper_first_ascii: number;
|
---|
122 | protected _alpha_upper_last_ascii: number;
|
---|
123 | protected _number_dict_ranges: ShortUniqueIdRanges;
|
---|
124 | protected _alpha_dict_ranges: ShortUniqueIdRanges;
|
---|
125 | protected _alpha_lower_dict_ranges: ShortUniqueIdRanges;
|
---|
126 | protected _alpha_upper_dict_ranges: ShortUniqueIdRanges;
|
---|
127 | protected _alphanum_dict_ranges: ShortUniqueIdRanges;
|
---|
128 | protected _alphanum_lower_dict_ranges: ShortUniqueIdRanges;
|
---|
129 | protected _alphanum_upper_dict_ranges: ShortUniqueIdRanges;
|
---|
130 | protected _hex_dict_ranges: ShortUniqueIdRanges;
|
---|
131 | protected _dict_ranges: ShortUniqueIdRangesMap;
|
---|
132 | protected log: (...args: any[]) => void;
|
---|
133 | /** Change the dictionary after initialization. */
|
---|
134 | setDictionary: (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean) => void;
|
---|
135 | seq: () => string;
|
---|
136 | /**
|
---|
137 | * Generates UUID based on internal counter that's incremented after each ID generation.
|
---|
138 | * @alias `const uid = new ShortUniqueId(); uid.seq();`
|
---|
139 | */
|
---|
140 | sequentialUUID: () => string;
|
---|
141 | rnd: (uuidLength?: number) => string;
|
---|
142 | /**
|
---|
143 | * Generates UUID by creating each part randomly.
|
---|
144 | * @alias `const uid = new ShortUniqueId(); uid.rnd(uuidLength: number);`
|
---|
145 | */
|
---|
146 | randomUUID: (uuidLength?: number) => string;
|
---|
147 | fmt: (format: string, date?: Date) => string;
|
---|
148 | /**
|
---|
149 | * Generates custom UUID with the provided format string.
|
---|
150 | * @alias `const uid = new ShortUniqueId(); uid.fmt(format: string);`
|
---|
151 | */
|
---|
152 | formattedUUID: (format: string, date?: Date) => string;
|
---|
153 | /**
|
---|
154 | * Calculates total number of possible UUIDs.
|
---|
155 | *
|
---|
156 | * Given that:
|
---|
157 | *
|
---|
158 | * - `H` is the total number of possible UUIDs
|
---|
159 | * - `n` is the number of unique characters in the dictionary
|
---|
160 | * - `l` is the UUID length
|
---|
161 | *
|
---|
162 | * Then `H` is defined as `n` to the power of `l`:
|
---|
163 | *
|
---|
164 | * <div style="background: white; padding: 5px; border-radius: 5px; overflow: hidden;">
|
---|
165 | * <img src="https://render.githubusercontent.com/render/math?math=%5CHuge%20H=n%5El"/>
|
---|
166 | * </div>
|
---|
167 | *
|
---|
168 | * This function returns `H`.
|
---|
169 | */
|
---|
170 | availableUUIDs: (uuidLength?: number) => number;
|
---|
171 | /**
|
---|
172 | * Calculates approximate number of hashes before first collision.
|
---|
173 | *
|
---|
174 | * Given that:
|
---|
175 | *
|
---|
176 | * - `H` is the total number of possible UUIDs, or in terms of this library,
|
---|
177 | * the result of running `availableUUIDs()`
|
---|
178 | * - the expected number of values we have to choose before finding the
|
---|
179 | * first collision can be expressed as the quantity `Q(H)`
|
---|
180 | *
|
---|
181 | * Then `Q(H)` can be approximated as the square root of the product of half
|
---|
182 | * of pi times `H`:
|
---|
183 | *
|
---|
184 | * <div style="background: white; padding: 5px; border-radius: 5px; overflow: hidden;">
|
---|
185 | * <img src="https://render.githubusercontent.com/render/math?math=%5CHuge%20Q(H)%5Capprox%5Csqrt%7B%5Cfrac%7B%5Cpi%7D%7B2%7DH%7D"/>
|
---|
186 | * </div>
|
---|
187 | *
|
---|
188 | * This function returns `Q(H)`.
|
---|
189 | *
|
---|
190 | * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))
|
---|
191 | */
|
---|
192 | approxMaxBeforeCollision: (rounds?: number) => number;
|
---|
193 | /**
|
---|
194 | * Calculates probability of generating duplicate UUIDs (a collision) in a
|
---|
195 | * given number of UUID generation rounds.
|
---|
196 | *
|
---|
197 | * Given that:
|
---|
198 | *
|
---|
199 | * - `r` is the maximum number of times that `randomUUID()` will be called,
|
---|
200 | * or better said the number of _rounds_
|
---|
201 | * - `H` is the total number of possible UUIDs, or in terms of this library,
|
---|
202 | * the result of running `availableUUIDs()`
|
---|
203 | *
|
---|
204 | * Then the probability of collision `p(r; H)` can be approximated as the result
|
---|
205 | * of dividing the square root of the product of half of pi times `r` by `H`:
|
---|
206 | *
|
---|
207 | * <div style="background: white; padding: 5px; border-radius: 5px; overflow: hidden;">
|
---|
208 | * <img src="https://render.githubusercontent.com/render/math?math=%5CHuge%20p(r%3B%20H)%5Capprox%5Cfrac%7B%5Csqrt%7B%5Cfrac%7B%5Cpi%7D%7B2%7Dr%7D%7D%7BH%7D"/>
|
---|
209 | * </div>
|
---|
210 | *
|
---|
211 | * This function returns `p(r; H)`.
|
---|
212 | *
|
---|
213 | * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))
|
---|
214 | *
|
---|
215 | * (Useful if you are wondering _"If I use this lib and expect to perform at most
|
---|
216 | * `r` rounds of UUID generations, what is the probability that I will hit a duplicate UUID?"_.)
|
---|
217 | */
|
---|
218 | collisionProbability: (rounds?: number, uuidLength?: number) => number;
|
---|
219 | /**
|
---|
220 | * Calculate a "uniqueness" score (from 0 to 1) of UUIDs based on size of
|
---|
221 | * dictionary and chosen UUID length.
|
---|
222 | *
|
---|
223 | * Given that:
|
---|
224 | *
|
---|
225 | * - `H` is the total number of possible UUIDs, or in terms of this library,
|
---|
226 | * the result of running `availableUUIDs()`
|
---|
227 | * - `Q(H)` is the approximate number of hashes before first collision,
|
---|
228 | * or in terms of this library, the result of running `approxMaxBeforeCollision()`
|
---|
229 | *
|
---|
230 | * Then `uniqueness` can be expressed as the additive inverse of the probability of
|
---|
231 | * generating a "word" I had previously generated (a duplicate) at any given iteration
|
---|
232 | * up to the the total number of possible UUIDs expressed as the quotiend of `Q(H)` and `H`:
|
---|
233 | *
|
---|
234 | * <div style="background: white; padding: 5px; border-radius: 5px; overflow: hidden;">
|
---|
235 | * <img src="https://render.githubusercontent.com/render/math?math=%5CHuge%201-%5Cfrac%7BQ(H)%7D%7BH%7D"/>
|
---|
236 | * </div>
|
---|
237 | *
|
---|
238 | * (Useful if you need a value to rate the "quality" of the combination of given dictionary
|
---|
239 | * and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)
|
---|
240 | */
|
---|
241 | uniqueness: (rounds?: number) => number;
|
---|
242 | /**
|
---|
243 | * Return the version of this module.
|
---|
244 | */
|
---|
245 | getVersion: () => string;
|
---|
246 | /**
|
---|
247 | * Generates a UUID with a timestamp that can be extracted using `uid.parseStamp(stampString);`.
|
---|
248 | *
|
---|
249 | * ```js
|
---|
250 | * const uidWithTimestamp = uid.stamp(32);
|
---|
251 | * console.log(uidWithTimestamp);
|
---|
252 | * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3
|
---|
253 | *
|
---|
254 | * console.log(uid.parseStamp(uidWithTimestamp));
|
---|
255 | * // 2021-05-03T06:24:58.000Z
|
---|
256 | * ```
|
---|
257 | */
|
---|
258 | stamp: (finalLength: number, date?: Date) => string;
|
---|
259 | /**
|
---|
260 | * Extracts the date embeded in a UUID generated using the `uid.stamp(finalLength);` method.
|
---|
261 | *
|
---|
262 | * ```js
|
---|
263 | * const uidWithTimestamp = uid.stamp(32);
|
---|
264 | * console.log(uidWithTimestamp);
|
---|
265 | * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3
|
---|
266 | *
|
---|
267 | * console.log(uid.parseStamp(uidWithTimestamp));
|
---|
268 | * // 2021-05-03T06:24:58.000Z
|
---|
269 | * ```
|
---|
270 | */
|
---|
271 | parseStamp: (suid: string, format?: string) => Date;
|
---|
272 | /**
|
---|
273 | * Set the counter to a specific value.
|
---|
274 | */
|
---|
275 | setCounter: (counter: number) => void;
|
---|
276 | constructor(argOptions?: Partial<ShortUniqueIdOptions>);
|
---|
277 | }
|
---|