| 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("") | |
| } | |