File size: 838 Bytes
89a2873 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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("")
}
|