Saltar al contenido

Genere cadenas / caracteres aleatorios en JavaScript

septiembre 23, 2021
apple touch icon@2

El problema con las respuestas a «Necesito cadenas al azar» preguntas (en cualquier idioma) es prácticamente cada solución utiliza una especificación primaria defectuosa de longitud de la cuerda. Las preguntas en sí mismas rara vez revelan por qué se necesitan las cadenas aleatorias, pero yo te desafiaría a que rara vez necesites cadenas aleatorias de longitud, digamos 8. Lo que invariablemente necesitas es un número de cuerdas únicas, por ejemplo, para usar como identificadores para algún propósito.

Hay dos formas principales de conseguir estrictamente único cadenas: determinista (que no es aleatorio) y almacenar / comparar (que es oneroso). qué hacemos? Renunciamos al fantasma. Vamos con unicidad probabilística en lugar de. Es decir, aceptamos que existe algún riesgo (por pequeño que sea) de que nuestras cadenas no sean únicas. Aquí es donde la comprensión probabilidad de colisión y entropía son útiles.

Así que reformularé la necesidad invariable como la necesidad de una cierta cantidad de cadenas con un pequeño riesgo de repetición. Como ejemplo concreto, digamos que desea generar un potencial de 5 millones de ID. No desea almacenar y comparar cada nueva cadena, y desea que sean aleatorias, por lo que acepta cierto riesgo de repetición. Como ejemplo, digamos un riesgo de menos de 1 en un billón de posibilidades de repetición. Entonces, ¿qué longitud de cuerda necesitas? Bueno, esa pregunta está subespecificada ya que depende de los caracteres utilizados. Pero lo que es más importante, está equivocado. Lo que necesita es una especificación de la entropía de las cadenas, no su longitud. La entropía se puede relacionar directamente con la probabilidad de una repetición en cierto número de cadenas. La longitud de la cuerda no puede.

Y aquí es donde una biblioteca como EntropyString poder ayudar. Para generar ID aleatorios que tienen menos de 1 en un billón de posibilidades de repetirse en 5 millones de cadenas usando entropy-string:

import {Random, Entropy} from 'entropy-string'

const random = new Random()
const bits = Entropy.bits(5e6, 1e12)

const string = random.string(bits)

«44hTNghjNHGGRHqH9»

entropy-string utiliza un juego de caracteres con 32 caracteres por defecto. Hay otros conjuntos de caracteres predefinidos y también puede especificar sus propios caracteres. Por ejemplo, generando ID con la misma entropía que arriba pero usando caracteres hexadecimales:

import {Random, Entropy, charSet16} from './entropy-string'

const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)

const string = random.string(bits)

«27b33372ade513715481f»

Tenga en cuenta la diferencia en la longitud de la cadena debido a la diferencia en el número total de caracteres en el juego de caracteres utilizado. El riesgo de repetición en el número especificado de cadenas potenciales es el mismo. Las longitudes de las cuerdas no lo son. Y lo mejor de todo es que el riesgo de repetición y el número potencial de cadenas es explícito. No más adivinanzas con la longitud de la cuerda.

close