| 123456789101112131415161718192021222324252627282930 |
- const length = 26
- const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- let lastTimestamp = 0
- let counter = 0
- export function ascending() {
- return create(false)
- }
- export function descending() {
- return create(true)
- }
- export function create(descending: boolean, timestamp = Date.now()) {
- if (timestamp !== lastTimestamp) {
- lastTimestamp = timestamp
- counter = 0
- }
- counter++
- const current = BigInt(timestamp) * 0x1000n + BigInt(counter)
- const value = descending ? ~current : current
- const time = Array.from({ length: 6 }, (_, index) =>
- Number((value >> BigInt(40 - 8 * index)) & 0xffn)
- .toString(16)
- .padStart(2, "0"),
- ).join("")
- const bytes = crypto.getRandomValues(new Uint8Array(length - 12))
- return time + Array.from(bytes, (byte) => chars[byte % 62]).join("")
- }
|