Domanda

Ho un oggetto con le seguenti proprietà


GID
ID
Codice
Nome

Alcuni client non vogliono inserire il codice, quindi il piano iniziale prevedeva di inserire l'ID nel codice ma l'oggetto base dell'orm è diverso, quindi sono come fregato ...

il mio piano era quello di mettere #### - #### nel codice valori totalmente casuali come posso generare qualcosa del genere dire un roba di tipo generatore di Windows 7 ma che non avrebbe un overhead cosa faresti in questo caso.

È stato utile?

Soluzione

Vuoi un valore casuale o un valore univoco?

random! = unique .

Ricorda, random indica semplicemente una probabilità che non generi lo stesso valore o una probabilità di generare lo stesso valore di nuovo . Con l'aumentare del tempo, aumenta la probabilità di generare un valore precedente, diventando quasi una certezza. Di cosa hai bisogno?

Personalmente, ti consiglio di utilizzare solo una Guida con un certo contesto [fare riferimento alla sezione più semplice di seguito]. Ho anche fornito altri suggerimenti in modo da avere opzioni, a seconda della situazione.


semplice

Se il codice è una stringa illimitata [cioè può essere di qualsiasi lunghezza], il mezzo semi-leggibile più semplice per generare un codice univoco sarebbe

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

puoi sostituire ormObject.Name con qualsiasi stringa distinguibile. Di solito userei typeof (objectInstance.GetType ()). Nome ma funzionerà solo se OrmObject è una classe base, se è una classe concreta usata per tutto lo faranno tutto finisce con tag simili. Il punto è aggiungere un po 'di contesto utente, in modo tale che - come nel riferimento di @Yuriy Faktorovich wtf article - gli utenti hanno qualcosa da leggere.


casuale

Ho risposto un giorno o due fa alla generazione di numeri casuali. Non tanto generare numeri quanto costruire un semplice framework flessibile attorno a un generatore per migliorare la qualità di codice e dati, questo dovrebbe aiutare a semplificare la tua fonte .

Se lo leggi, potresti facilmente scrivere un metodo di estensione, diciamo

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 ();
    ...

Per generare effettivamente un valore, suggerirei di implementare un'interfaccia IRandom con un'implementazione System.Security.Cryptography.RNGCryptoServiceProvider . Tale implementazione genererebbe un buffer di X byte casuali e ne eliminerebbe il numero necessario, rigenerando un flusso quando esaurito.

Inoltre, non so perché continuo a scrivere, immagino che questo problema sia davvero affascinante! - se CodeType è una stringa e desideri qualcosa di leggibile, puoi semplicemente prendere detti byte casuali e trasformarli in un "apparentemente" stringa leggibile tramite conversione 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
        ...
    }
}

Ricorda

random! = unique .

I tuoi valori verranno ripetuti . Alla fine.


unico

Esistono diverse domande che è necessario porsi in merito al proprio problema.

  1. Tutti i valori Code devono essere univoci? [se no, ci stai provando troppo]
  2. Che tipo è Code ? [se una stringa di qualsiasi lunghezza, utilizzare un Guid completo]
  3. È un'applicazione distribuita? [in caso contrario, utilizzare un valore DB come suggerito da @LBushkin sopra]
  4. Se si tratta di un'applicazione distribuita, le applicazioni client possono generare e inviare istanze di questi oggetti? [se è così, allora vuoi un identificatore univoco a livello globale, e di nuovo le Guide sono una scommessa sicura]

Sono sicuro che hai più vincoli, ma questo è un esempio del tipo di linea di indagine che devi eseguire quando incontri un problema come il tuo. Da queste domande, ti verranno in mente una serie di vincoli. Questi vincoli informeranno il tuo design.

Spero che questo aiuti :)

A proposito, riceverai soluzioni di qualità migliore se pubblichi maggiori dettagli [es. vincoli] sul tuo problema. Ancora una volta, che tipo è Code , ci sono vincoli di lunghezza? Vincoli di formato? Vincoli di carattere?

Arg, ultima modifica, lo giuro . Se finisci per usare le Guide, potresti voler offuscare questo o persino "comprimere" la loro rappresentazione codificandoli in base64 - simile alla conversione base64 sopra per numeri casuali. <

Altri suggerimenti

Puoi generare un Guid usando:

Guid.NewGuid().ToString();

Ti darebbe qualcosa del tipo:

  

788E94A0-C492-11DE-BFD4-FCE355D89593

Usa una colonna Autonumber o Sequencer dal tuo database per generare un numero di codice univoco. Quasi tutti i database moderni supportano i numeri generati automaticamente in una forma o nell'altra. Guarda cosa supporta il tuo database.

I valori di autonumber / sequencer dal DB sono garantiti come unici e sono relativamente poco costosi da acquisire. Se si desidera evitare numeri completamente sequenziali assegnati ai codici, è possibile raggruppare e concatenare più valori del sequencer insieme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top