Generador de campo de código aleatorio C # para objeto
-
10-07-2019 - |
Pregunta
Tengo un objeto con las siguientes propiedades
GID
ID de
Código
Nombre
Algunos de los clientes no quieren ingresar el Código, por lo que el plan inicial era poner la ID en el código, pero el objeto base del orm es diferente, así que estoy jodido ...
mi plan era poner #### - #### valores totalmente aleatorios en el código, ¿cómo puedo generar algo así, por ejemplo, un generador de serie de Windows 7, pero eso no tendría una sobrecarga? ¿Qué harías en esto? caso.
Solución
¿Desea un valor aleatorio o un valor único?
random! = unique .
Recuerde, aleatorio simplemente establece una probabilidad de no generar el mismo valor, o una probabilidad de generar el mismo valor nuevamente . A medida que aumenta el tiempo, aumenta la probabilidad de generar un valor anterior, convirtiéndose en una certeza cercana. ¿Cuál necesitas?
Personalmente, recomiendo usar un Guid con algún contexto [consulte la sección más fácil a continuación]. También proporcioné algunas otras sugerencias para que tenga opciones, dependiendo de su situación.
easiest
Si el Código es una cadena ilimitada [es decir, puede ser de cualquier longitud], los medios semi legibles más fáciles de generar un código único serían
OrmObject ormObject= new OrmObject ();
string code = string.
Format ("{0} [{1}]", ormObject.Name, Guid.NewGuid ()).
Trim ();
// generates something like
// "My Product [DA9190E1-7FC6-49d6-9EA5-589BBE6E005E]"
puede sustituir ormObject.Name
por cualquier cadena distinguible. Normalmente usaría typeof (objectInstance.GetType ()). Name
pero eso solo funcionará si OrmObject es una clase base, si es una clase concreta utilizada para todo lo harán todos terminan con etiquetas similares. El punto es agregar algo de contexto de usuario, de modo que, como en @Yuriy Faktorovich, se hace referencia a wtf article : los usuarios tienen algo para leer.
random
Respondí hace uno o dos días sobre la generación de números aleatorios. No tanto generar números como construir un marco flexible simple alrededor de un generador para mejorar la calidad del código y los datos, esto debería ayudar a optimizar su fuente .
Si lees eso, podrías escribir fácilmente un método de extensión, por ejemplo
public static class IRandomExtensions
{
public static CodeType GetCode (this IRandom random)
{
// 1. get as many random bytes as required
// 2. transform bytes into a 'Code'
// 3. bob's your uncle
...
}
}
// elsewhere in code
...
OrmObject ormObject = new OrmObject ();
ormObject.Code = random.GetCode ();
...
Para generar realmente un valor, sugeriría implementar una interfaz IRandom
con una implementación System.Security.Cryptography.RNGCryptoServiceProvider
. Dicha implementación generaría un búfer de X bytes aleatorios y repartiría tantos como fuera necesario, regenerando una secuencia cuando se agote.
Además, no sé por qué sigo escribiendo, ¡supongo que este problema es realmente fascinante! - si CodeType es una cadena y desea algo legible, puede tomar dichos bytes aleatorios y convertirlos en un "aparentemente" cadena legible a través de la conversión Base64
public static class IRandomExtensions
{
// assuming 'CodeType' is in fact a string
public static string GetCode (this IRandom random)
{
// 1. get as many random bytes as required
byte[] randomBytes; // fill from random
// 2. transform bytes into a 'Code'
string randomBase64String =
System.Convert.ToBase64String (randomBytes).Trim ("=");
// 3. bob's your uncle
...
}
}
Recuerda
random! = unique .
Sus valores se repetirán . Eventualmente.
unique
Hay una serie de preguntas que debe hacerse sobre su problema.
- ¿Todos los valores de
Code
deben ser únicos? [si no, lo estás intentando demasiado] - ¿Qué tipo es
Code
? [si es una cadena de cualquier longitud, use un Guid completo] - ¿Es esta una aplicación distribuida? [si no, use un valor de DB como lo sugiere @LBushkin arriba]
- Si se trata de una aplicación distribuida, ¿pueden las aplicaciones cliente generar y enviar instancias de estos objetos? [si es así, entonces desea un identificador único a nivel mundial, y nuevamente las guías son una apuesta segura]
Estoy seguro de que tiene más restricciones, pero este es un ejemplo del tipo de línea de investigación que debe realizar cuando se encuentra con un problema como el suyo. A partir de estas preguntas, surgirá una serie de restricciones. Estas restricciones informarán su diseño.
Espero que esto ayude :)
Por cierto, recibirá soluciones de mejor calidad si publica más detalles [es decir, restricciones] sobre su problema. De nuevo, ¿qué tipo es Code
, hay restricciones de longitud? Restricciones de formato? Restricciones de caracteres?
Arg, última edición, lo juro . Si terminas usando Guías, quizás quieras ofuscar esto, o incluso "comprimir" su representación codificándolos en base64, similar a la conversión de base64 anterior para números aleatorios. <
Otros consejos
Puede generar un Guid usando:
Guid.NewGuid().ToString();
Te daría algo como:
788E94A0-C492-11DE-BFD4-FCE355D89593
Use una columna o secuenciador de Autonumber de su base de datos para generar un número de código único. Casi todas las bases de datos modernas admiten números generados automáticamente de una forma u otra. Mire lo que admite su base de datos.
Los valores de Autonumber / Sequencer del DB están garantizados para ser únicos y son relativamente baratos de adquirir. Si desea evitar números completamente secuenciales asignados a códigos, puede rellenar y concatenar varios valores de secuenciador juntos.