Me gustaría generar cadenas únicas aleatorias como las que genera la biblioteca MSDN. ( Objeto de error ), por ejemplo. Se debe generar una cadena como 't9zk6eay'.
97
Me gustaría generar cadenas únicas aleatorias como las que genera la biblioteca MSDN. ( Objeto de error ), por ejemplo. Se debe generar una cadena como 't9zk6eay'.
string randoms = Guid.NewGuid().ToString().Replace("-", string.Empty).Replace("+", string.Empty).Substring(0, 4);
más se puede encontrar aquíRespuestas:
Usar Guid sería una manera bastante buena, pero para obtener algo que se parezca a su ejemplo, probablemente desee convertirlo en una cadena Base64:
Me deshago de "=" y "+" para acercarme un poco más a tu ejemplo; de lo contrario, obtienes "==" al final de tu cadena y un "+" en el medio. Aquí hay una cadena de salida de ejemplo:
"OZVV5TpP4U6wJthaCORZEQ"
fuente
Convert.ToBase64String
se trata, eche un vistazo aquí .new Guid()
sin "hackear" (alterar el reloj o las estructuras de datos internas de Windows). No dude en utilizar tantos núcleos, subprocesos, primitivas de sincronización, etc., como desee.Actualización 2016/1/23
Si encuentra útil esta respuesta, es posible que le interese una biblioteca de generación de contraseñas simple (~ 500 SLOC) que publiqué :
Luego puede generar cadenas aleatorias como en la respuesta a continuación:
Una ventaja de la biblioteca es que el código está mejor factorizado para que pueda usar la aleatoriedad segura para más que generar cadenas . Consulte el sitio del proyecto para obtener más detalles.
Respuesta original
Como nadie ha proporcionado un código seguro todavía, publico lo siguiente en caso de que alguien lo encuentre útil.
Gracias a Ahmad por señalar cómo hacer que el código funcione en .NET Core.
fuente
.netcore
: Reemplazarvar rng = new RNGCryptoServiceProvider()
convar rng = RandomNumberGenerator.Create()
Les advierto que los GUID no son números aleatorios . No deben usarse como base para generar nada que espere que sea totalmente aleatorio (consulte http://en.wikipedia.org/wiki/Globally_Unique_Identifier ):
En su lugar, simplemente use el método C # Random. Algo como esto ( código que se encuentra aquí ):
Los GUID están bien si desea algo único (como un nombre de archivo único o una clave en una base de datos), pero no son buenos para algo que desea que sea aleatorio (como una contraseña o una clave de cifrado). Entonces depende de tu aplicación.
Editar . Microsoft dice que Random tampoco es tan bueno ( http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx ):
fuente
Simplifiqué la solución de @Michael Kropats e hice una versión al estilo LINQ.
fuente
No creo que realmente sean aleatorios, pero supongo que son algunos hash.
Siempre que necesito algún identificador aleatorio, normalmente uso un GUID y lo convierto a su representación "desnuda":
fuente
Pruebe la combinación entre Guid y Time.
fuente
Me sorprende que no exista una solución CrytpoGraphic. GUID es único pero no criptográficamente seguro . Vea este violín Dotnet.
En caso de que desee anteponer un Guid:
Una cadena alfanumérica más limpia:
fuente
Solución de Michael Kropats en VB.net
fuente
Esto funciona perfecto para mi
fuente
Esto se ha solicitado para varios idiomas. Aquí hay una pregunta sobre las contraseñas que también debería ser aplicable aquí.
Si desea utilizar las cadenas para acortar la URL, también necesitará un Diccionario <> o una verificación de la base de datos para ver si ya se ha utilizado una ID generada.
fuente
Si desea cadenas alfanuméricas con minúsculas y mayúsculas ([a-zA-Z0-9]), puede usar Convert.ToBase64String () para una solución rápida y sencilla.
En cuanto a la singularidad, consulte el problema de cumpleaños para calcular la probabilidad de que se dé una colisión (A) la longitud de las cadenas generadas y (B) la cantidad de cadenas generadas.
fuente
fuente
Obtenga una clave única usando el código GUID Hash
fuente