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.

¿Fue útil?

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.

  1. ¿Todos los valores de Code deben ser únicos? [si no, lo estás intentando demasiado]
  2. ¿Qué tipo es Code ? [si es una cadena de cualquier longitud, use un Guid completo]
  3. ¿Es esta una aplicación distribuida? [si no, use un valor de DB como lo sugiere @LBushkin arriba]
  4. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top