Frage

Ich habe ein Objekt mit den folgenden Eigenschaften


GID
ID
-Code
Name

Einige der Kunden nicht wollen, den Code einzugeben, um der intial Plan, um die ID im Code zu setzen, sondern die baseobject des ORM ist anders, so wie ich bin geschraubt ...

mein Plan zu setzen #### war - #### völlig zufällige Werte in Code wie kann ich so etwas erzeugen sagen, ein Windows 7 serielle Typ Sachen Generator aber würde das nicht einen Overhead hat, was würden Sie in dem tun Fall.

War es hilfreich?

Lösung

Haben Sie einen zufälligen Wert wollen, oder einen eindeutigen Wert?

zufällig! = Einzigartig .

Denken Sie daran, gelegentlich gibt lediglich an, eine Wahrscheinlichkeit von nicht den gleichen Wert zu erzeugen, oder mit einer Wahrscheinlichkeit von dem gleichen Wert zu erzeugen wieder . Im Laufe der Zeit zunimmt, die Wahrscheinlichkeit eines früheren Wert steigt die Erzeugung - zu einer in der Nähe Gewißheit. Welche benötigen Sie?

Ich persönlich empfehle mit einem gewissen Kontext eine Guid nur mit [siehe am einfachsten unten]. Ich stellte auch einige andere Vorschläge, so dass Sie Optionen haben, je nach Ihrer Situation.


am einfachsten

Wenn Code eine unbeschränkte Zeichenfolge [dh sie kann beliebig lang sein], einfachste halb lesbar mittels eines eindeutigen Codes zu erzeugen wäre

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

Sie können ormObject.Name für jede unterscheidbare Zeichenfolge ersetzen. Ich würde verwenden typeof (objectInstance.GetType ()).Name der Regel aber das wird nur funktionieren, wenn OrmObject eine Basisklasse ist, wenn es eine konkrete Klasse wird benutzt, um für alles sie werden alle oben mit ähnlichen Tags beenden. Der Punkt ist, einigen Benutzerkontext, so dass hinzufügen - wie in @Yuriy Faktorowitsch der referenzierten wtf Artikel -. Benutzer etwas lesen


zufällig

, antwortete ich einen oder zwei Tage vor etwa Erzeugung von Zufallszahlen. Nicht so viel Erzeugen Zahlen als den Aufbau eines einfachen flexiblen Rahmen um einen Generator Qualität des Codes zu verbessern und Daten, dies sollte Ihre Quelle helfen zu optimieren.

Wenn Sie das lesen, könnten Sie eine Erweiterungsmethode leicht schreiben, sagen

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

Um einen Wert tatsächlich zu erzeugen, würde ich vorschlagen, eine IRandom Schnittstelle mit einer System.Security.Cryptography.RNGCryptoServiceProvider Implementierung umzusetzen. Sagte Implementierung eines Puffers von X zufälligen Bytes erzeugen würde, und so viele wie erforderlich austeilen, einen Strom zu regenerieren, wenn erschöpft.

Außerdem - ich weiß nicht, warum ich immer wieder schreiben, ich denke, das Problem wirklich sehr faszinierend ist! - wenn Codetype String ist und Sie wollen etwas lesbar, könnten Sie gerade gesagt nehmen zufällige Bytes und sie in einer „scheinbar“ lesbaren String über Base64 Umwandlung

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
        ...
    }
}

Speichern

zufällig! = Einzigartig .

Ihre Werte wird wiederholen. Irgendwann.


unique

Es gibt eine Reihe von Fragen, die Sie sich über Ihr Problem stellen müssen.

  1. Müssen alle Code Werte eindeutig sein? [Wenn nicht, Sie versuchen zu hart]
  2. Welche Art ist Code? [Falls eine Zeichenfolge der Länge, verwenden Sie eine vollständige Guid]
  3. Ist das eine verteilte Anwendung? [Wenn nicht, verwenden Sie einen Wert DB wie @LBushkin oben vorgeschlagen]
  4. Wenn es sich um eine Anwendung verteilt wird, kann Client-Anwendungen generieren und Instanzen dieser Objekte einreichen? [Wenn ja, dann wollen Sie ein Globally Unique Identifier, und wieder Guids sind eine sichere Wette]

Ich bin sicher, dass Sie mehr Einschränkungen haben, aber dies ist ein Beispiel für die Art von Linie der Untersuchung müssen Sie durchführen, wenn Sie ein Problem wie Ihr eigenes begegnen. Aus diesen Fragen, kommen Sie mit einer Reihe von Einschränkungen auf. Diese Einschränkungen informieren Ihr Design.

Hope, das hilft:)

Btw, werden Sie bessere Qualität Lösungen erhalten, wenn Sie mehr Details [dh Einschränkungen] über Ihr Problem stellen. Auch welche Art Code ist, gibt es Längenbeschränkungen? Format Einschränkungen? Zeichenbeschränkungen?

Arg, zuletzt, I schwören . Wenn Sie mit Guids am Ende tun, können Sie wollen, dies zu verschleiern, oder sogar „komprimieren“ ihre Darstellung von ihnen in Base64 codiert, -. Ähnlich wie Base64 Umwandlung oben für Zufallszahl

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

Im Gegensatz zu Verkürzen, base64 konversion ist nicht eine lossful Transformation. Natürlich über die Trimmung ist in Zusammenhang mit der vollständigen base64 Expansion lossful - aber = ist nur Polsterung, zusätzliche Informationen eingeführt durch die Umwandlung, und nicht Teil der ursprünglichen Daten Guid. Wenn Sie gehen wollen zurück zu einem Guid aus dieser Base64-Wert konvertiert, dann werden Sie wieder Pad haben Ihre base64 String bis zu seiner Länge ein Vielfaches von 4 ist - fragen Sie nicht, nur nachschlagen base64, wenn Sie daran interessiert sind:)

Andere Tipps

Sie könnten eine Guid erzeugen mit:

Guid.NewGuid().ToString();

Es würden Sie so etwas wie:

  

788E94A0-C492-11DE-BFD4-FCE355D89593

Verwenden Sie eine Autowert-Spalte oder Sequencer aus Ihrer Datenbank einen eindeutigen Codenummer zu erzeugen. Fast alle modernen Datenbanken unterstützen Zahlen in einen oder anderen Form automatisch generiert. Schauen Sie in das, was Sie Datenbank unterstützt.

Automatische Nummerierung / Sequencer Werte aus der DB sind garantiert eindeutig sein und sind relativ preiswert zu erwerben. Wenn Sie vollständig sequentielle Nummern-Codes zugeordnet vermeiden möchten, können Sie Pad und mehrere Sequenzer Werte zusammen verketten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top