Improves random generation

feat/improve-random-func
Alex Kern 9 months ago
parent 770dd8ee98
commit 7567747f94
No known key found for this signature in database
GPG Key ID: EF051FACCACBEE25

@ -38,7 +38,7 @@ async function generateShortSlugUntilUnique(
checkExists: (key: string) => Promise<boolean>, checkExists: (key: string) => Promise<boolean>,
): Promise<string> { ): Promise<string> {
for (let i = 0; i < config.shortSlug.maxAttempts; i++) { for (let i = 0; i < config.shortSlug.maxAttempts; i++) {
const slug = generateShortSlug() const slug = await generateShortSlug()
const exists = await checkExists(getShortSlugKey(slug)) const exists = await checkExists(getShortSlugKey(slug))
if (!exists) { if (!exists) {
return slug return slug

@ -25,12 +25,17 @@ function generateRandomWords(
} }
const getRandomInt = (max: number): number => { const getRandomInt = (max: number): number => {
const buffer = new Uint32Array(1) const limit = 4294967295 - (4294967295 % max) // uint32 max
let buffer = new Uint32Array(1)
do {
if (typeof window !== 'undefined' && window.crypto) { if (typeof window !== 'undefined' && window.crypto) {
window.crypto.getRandomValues(buffer) window.crypto.getRandomValues(buffer)
} else { } else {
crypto.randomFillSync(buffer) crypto.randomFillSync(buffer)
} }
} while (buffer[0] >= limit)
return buffer[0] % max return buffer[0] % max
} }
@ -44,15 +49,12 @@ function generateRandomWords(
}) })
} }
export const generateShortSlug = (): string => { export const generateShortSlug = async (): Promise<string> => {
let result = '' const parts = await generateRandomWords(
for (let i = 0; i < config.shortSlug.numChars; i++) { config.shortSlug.chars.split(''),
result += config.shortSlug.numChars,
config.shortSlug.chars[ )
Math.floor(Math.random() * config.shortSlug.chars.length) return parts.join('')
]
}
return result
} }
export const generateLongSlug = async (): Promise<string> => { export const generateLongSlug = async (): Promise<string> => {

Loading…
Cancel
Save