Pergunta

Eu tenho um objeto com as seguintes propriedades


GID
ID
Código
Nome

Alguns dos clientes não quer introduzir o código para o plano intial foi a de colocar o ID no código, mas o BaseObject da ORM é diferente, então eu sou como parafusado ...

meu plano era colocar #### - #### valores totalmente aleatórias no código como eu pode gerar algo assim dizer windows 7 de série tipo de gerador coisas, mas que não iria ter uma sobrecarga o que você faria neste caso.

Foi útil?

Solução

Você quer um valor aleatório, ou um valor único?

aleatória! = Única .

Lembre-se, aleatório afirma apenas uma probabilidade de não gerar o mesmo valor, ou uma probabilidade de gerar o mesmo valor novo . À medida que aumenta o tempo, a probabilidade de gerar um valor aumenta anteriores - tornando-se quase uma certeza. Qual você necessita?

Pessoalmente, eu recomendo apenas usando um Guid com algum contexto [consulte mais fácil seção abaixo]. Eu também forneceu algumas outras sugestões para que você tenha opções, dependendo da sua situação.


mais fácil

Se o Código é uma seqüência ilimitada [ou seja, pode ser de qualquer comprimento], mais fáceis meios semi-legíveis de gerar um código único seria

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]"

Você pode substituir ormObject.Name para qualquer cadeia distinguíveis. Eu usaria normalmente typeof (objectInstance.GetType ()).Name mas isso só funcionará se OrmObject é uma classe base, se é uma classe concreta usado para tudo todos eles vão acabar com etiquetas semelhantes. O ponto é para adicionar algum contexto do usuário, de modo que - como no de @Yuriy Faktorovich Referenciado wtf artigo -. usuários têm algo para ler


aleatória

Eu respondi um ou dois dias atrás sobre a geração de números aleatórios. Não tanto gerando Números como a construção de uma estrutura flexível simples em torno de um gerador para melhorar a qualidade de código e dados, isso deve ajudar a simplificar sua fonte .

Se você ler isso, você poderia facilmente escrever um método de extensão, dizem

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 realmente gerar um valor, gostaria de sugerir implementação de uma interface IRandom com uma implementação System.Security.Cryptography.RNGCryptoServiceProvider. A referida implantação iria gerar um tampão de bytes X aleatórios, e distribuir tantos quanto necessário, regeneração de uma corrente quando esgotado.

Além disso - Eu não sei por que eu continuar a escrever, eu acho que este problema é realmente muito fascinante! - se CodeType é corda e você quer algo legível, você pode apenas tomar disse bytes aleatórios e transformá-los em um "aparentemente" string legível através da conversão 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
        ...
    }
}

Lembre-se

aleatória! = Única .

Seus valores irá de repetição. Eventualmente.


única

Há uma série de perguntas que você precisa perguntar-se sobre o seu problema.

  1. Deve todos os valores Code ser único? [Se não, você está tentando demasiado duro]
  2. Que tipo é Code? [If any-comprimento da corda, use uma completa Guid]
  3. É este um aplicativo distribuído? [Se não, use um valor DB como sugerido por @LBushkin acima]
  4. Se for uma aplicação distribuída, pode aplicativos cliente gerar e enviar as instâncias desses objetos? [Se sim, então você quer um identificador exclusivo, e novamente Guids são uma aposta certa]

Eu tenho certeza que você tem mais restrições, mas este é um exemplo do tipo de linha de investigação que precisam ser executadas quando se deparar com um problema como o seu próprio. A partir dessas perguntas, você vai vir para cima com uma série de restrições. Estas restrições vão informar o seu design.

Espero que isso ajude:)

Btw, você receberá soluções de melhor qualidade se você postar mais detalhes [ie restrições] sobre o seu problema. Novamente, o tipo é Code, existem restrições de comprimento? restrições de formato? restrições de caracteres?

Arg, última edição, I jura . Se você acabar usando Guids, você pode querer ofuscar isso, ou mesmo "compressa" sua representação através da codificação-los em base64 -. Semelhante à conversão base64 acima para números aleatórios

public static class GuidExtensions
{
    public static string ToBase64String (this Guid id)
    {
        return System.Convert.
            ToBase64String (id.ToByteArray ()).
            Trim ("=");
    }
}

Ao contrário truncando, base64 conversion é não uma transformação lossful. Claro, a guarnição acima é lossful no contexto de expansão base64 cheia - mas = é apenas estofamento, informação extra introduzido por a conversão, e não faz parte dos dados Guid originais. Se você quer ir volta para um Guid deste base64 valor convertido, então você terá que re-pad sua seqüência de base64 até seu comprimento é um múltiplo de 4 - não pergunte, basta olhar para cima base64 se você estiver interessado:)

Outras dicas

Você poderia gerar um Guid usando:

Guid.NewGuid().ToString();

Seria dar-lhe algo como:

788E94A0-C492-11DE-BFD4-FCE355D89593

Use uma coluna Autonumber ou Sequencer do seu banco de dados para gerar um número de código único. Quase todos os bancos de dados modernos suportam gerado automaticamente números de uma forma ou de outra. Olhar para o que você banco de dados suporta.

Os valores Autonumber / Sequencer do DB são garantidos para ser único e são relativamente baratos para adquirir. Se você quer evitar números completamente sequenciais atribuídos os códigos, você pode pad e concatenar vários valores sequenciador juntos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top