mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-24 12:15:51 -04:00
31 lines
838 B
TypeScript
31 lines
838 B
TypeScript
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("")
|
|
}
|