Question

J'ai un objet avec les propriétés suivantes


GID
ID Code
Nom de famille

Certains clients ne veulent pas entrer le code, donc le plan initial consistait à insérer l'identifiant dans le code, mais l'objet de base de l'orme est différent, donc je suis comme foutu ...

mon plan était de mettre #### - #### des valeurs totalement aléatoires dans le code, comment puis-je générer quelque chose comme ça, par exemple un générateur de série de Windows 7, mais sans surcharge, que feriez-vous dans cet environnement? cas.

Était-ce utile?

La solution

Voulez-vous une valeur aléatoire ou une valeur unique?

random! = unique .

N'oubliez pas, aléatoire indique simplement une probabilité de ne pas générer la même valeur, ou une probabilité de générer la même valeur à nouveau . À mesure que le temps augmente, la probabilité de générer une valeur antérieure augmente, devenant une quasi-certitude. De quoi avez-vous besoin?

Personnellement, je vous recommande simplement d'utiliser un Guid avec un contexte spécifique [reportez-vous à la section la plus facile ci-dessous]. J'ai également fourni d'autres suggestions afin que vous disposiez d'options, en fonction de votre situation.

le plus facile

Si Code est une chaîne non limitée [c.-à-d. qu'elle peut être de n'importe quelle longueur], le moyen le plus simple, semi-lisible, de générer un code unique serait

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

vous pouvez remplacer ormObject.Name par toute chaîne pouvant être distinguée. J'utiliserais typiquement typeof (objectInstance.GetType ()). Name , mais cela ne fonctionnera que si OrmObject est une classe de base, s'il s'agit d'une classe concrète utilisée pour tout tous finissent avec des balises similaires. Le but est d’ajouter un contexte utilisateur, tel que - comme dans @Yuriy Faktorovich, référencé Article wtf : les utilisateurs ont quelque chose à lire.

aléatoire

J'ai répondu il y a un jour ou deux à propos de la génération de nombres aléatoires. Générer des nombres plutôt que de créer un cadre simple et flexible autour d’un générateur pour améliorer la qualité du code et des données, Cela devrait aider à rationaliser votre source .

Si vous lisez cela, vous pouvez facilement écrire une méthode d'extension, disons

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

Pour générer une valeur, je suggérerais d'implémenter une interface IRandom avec une implémentation System.Security.Cryptography.RNGCryptoServiceProvider . Cette implémentation générerait un tampon de X octets aléatoires et en distribuerait autant que nécessaire, régénérant un flux une fois épuisé.

En outre - je ne sais pas pourquoi je continue d’écrire, je suppose que ce problème est vraiment fascinant! - Si CodeType est une chaîne et que vous voulez quelque chose de lisible, vous pouvez simplement prendre lesdits octets aléatoires et les transformer en un "apparemment". chaîne lisible via la conversion 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
        ...
    }
}

N'oubliez pas

random! = unique .

Vos valeurs seront répétées . Finalement.

unique

Vous devez vous poser un certain nombre de questions sur votre problème.

  1. Toutes les valeurs Code doivent-elles être uniques? [Si non, vous essayez trop fort]
  2. Quel type est code ? [si une chaîne de longueur quelconque, utilisez un Guid complet]
  3. S'agit-il d'une application distribuée? [si non, utilisez une valeur de base de données comme suggéré par @LBushkin ci-dessus]
  4. S'il s'agit d'une application distribuée, les applications clientes peuvent-elles générer et soumettre des instances de ces objets? [Si tel est le cas, vous souhaitez un identifiant unique au monde et les guids sont une valeur sûre]

Je suis sûr que vous avez plus de contraintes, mais c’est un exemple du genre de question que vous devez interroger lorsque vous rencontrez un problème comme le vôtre. A partir de ces questions, vous arriverez à une série de contraintes. Ces contraintes informeront votre conception.

J'espère que cela vous aidera:)

Par ailleurs, vous obtiendrez des solutions de meilleure qualité si vous publiez plus de détails (contraintes) sur votre problème. Encore une fois, quel type est Code , existe-t-il des contraintes de longueur? Contraintes de format? Contraintes de caractère?

Arg, dernière modification, je jure . Si vous finissez par utiliser Guids, vous voudrez peut-être dissimuler cela, ou même "compresser" leur représentation en les encodant en base64 - similaire à la conversion en base64 ci-dessus pour les nombres aléatoires. <

Autres conseils

Vous pouvez générer un Guid en utilisant:

Guid.NewGuid().ToString();

Cela vous donnerait quelque chose comme:

  

788E94A0-C492-11DE-BFD4-FCE355D89593

Utilisez une colonne de numérotation automatique ou un séquenceur de votre base de données pour générer un numéro de code unique. Presque toutes les bases de données modernes prennent en charge les numéros générés automatiquement sous une forme ou une autre. Examinez ce que votre base de données prend en charge.

Les valeurs de numérotation automatique / séquenceur de la base de données sont garanties uniques et relativement peu coûteuses à acquérir. Si vous souhaitez éviter les numéros complètement séquentiels affectés aux codes, vous pouvez compiler et concaténer plusieurs valeurs de séquenceur ensemble.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top