Eine nummer mittels eines strings generieren?



  • hallo forum 🙂

    ich würde gerne eine nummer generieren die mittels eines strings eindeutig bzw. einzigartig wird. im string sind informationen wie z.b. "abc4n2j" enthalten und dazu noch das aktuelle datum + uhrzeit. daraus soll nun eine nummer entstehen inder form 10482023. das ganze soll absolut einzigartig werden, es dürfen keine nummern durch zufall identisch werden. deswegen denke ich das miteinbeziehen von datum + uhrzeit sollte reichen. mann könnte dann noch zufallszahlen ans ende der generierten nummer machen.

    meine frage ist nun, wie ich sowas am besten löse, damit ich aus einem normalen string eine sollche nummer generiere. :xmas1: :xmas2:



  • Funtana schrieb:

    ich würde gerne eine nummer generieren die mittels eines strings eindeutig bzw. einzigartig wird.

    Hinweis: Es gibt meht strings als die höchste Zahl, die in der Variable eines gewöhnlichen Zahlen-Datentyps wie int gespeichert werden kann.

    Ansonsten kannst du jeweils mit dem Encoding-Wert eines Zeichens arbeiten.



  • Lieber Funtana!
    Vielleicht möchtest Du uns erklären, was du mit dieser eindeutigen ID (?) anstellen möchtest? Vielleicht kann man Dir besser helfen, wenn man Dein Problem versteht - und nicht nur den Lösungsansatz den Du Dir selbst schon (unumstößlich) festgelegt hast und an dem Du Dich eventuell aufhängst.

    Generell kommt es auf das Environment an, ob es ausreicht, das aktuelle Datum und die Uhrzeit zu verwenden. Ich denke gerade an ein verteiltes Multi-User-System. Was passiert denn, wenn wenigstens zwei Benutzer gleichzeitig eine solche ID brauchen? Soll zu jeder Zeit nur die Erzeugung einer einzelnen ID erforderlich und möglich sein, so nimmst Du zB 20061202123415 (YYYYMMDDHHMMSS) und setzt diese wunderschöne Zahl in einen String um - zB durch ASCII. Du solltest natürlich einen Algo entwerfen der umkehrbar ist und die nicht darstellbaren ASCII-Codes berücksichtigt.

    Greetz, Swordfish



  • @Funtana:

    Ich denke was du erstellen willst ist eine GUID (global unique identifier). Je nach System kann man GUIDs einfach so mittels einer API Funktion abholen (Windows), oder muss sie evtl. selbst generieren.

    Wenn du sie wirklich selbst generieren willst, dann würde ich vorschlagen folgende Dinge mit aufzunehmen:
    * die MAC Adresse einer Netzwerkkarte (falls vorhanden)
    * die Zeit die das System schon läuft (Windows: GetTickCount)
    * Datum + Uhrzeit
    * irgendwelche nicht deterministischen Zufallszahlen

    Die "nicht deterministischen Zufallszahlen" sind wohl der schwierigste Punkt, aber die kann man sich meist vom Betriebssystem holen. Windows hat dafür die Funktion CryptGenRandom, diverse UNIXe haben dafür "/dev/rand".

    Die ganzen so ermittelten Daten pappst du einfach in einen String oder ein Byte Array hintereinander, und dann ermittelst du einen Hashcode (z.B. MD5) dieses Strings/Byte Arrays. Das Ergebnis sollte min. 128 Bit lang sein.



  • hallo hustbaer, die idee ist schon gut hatte sowas in die richtung auch geplant aber ich will am ende keinen hash sondern wirklich nur nummern 🙂



  • Funtana schrieb:

    ich will am ende keinen hash sondern wirklich nur nummern

    Ein Hash ist aber auch eine Nummer, die jedoch gewöhnlich im Hexadezimalsystem dargestellt wird. Ein Hash-Wert ist aber mehrdeutig, und laut des wikipedia-Artikels ist die Ermittlung von Rückschlüssen (zumindest auf Dateien) in den USA schwachsinnigerweise patentiert 😮

    Wie auch immer, hier ein Beispiel ohne Hashing:

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    string str_to_num(const string &s)
    {
        ostringstream strm;
        for(string::const_iterator iter = s.begin(); iter != s.end(); ++iter)
            strm << (static_cast<int>(*iter) + 100); //Durch die Addition von 100 wird sichergestellt, dass jedes Zeichen eine 3-stellige Zahl ist
        return strm.str();
    }
    
    string num_to_str(const string &s)
    {
        int charValue;
        string result;
        result.reserve(s.length() / 3);
    
        for(size_t i = 0; i < s.length(); i += 3)
        {
            istringstream(s.substr(i, 3)) >> charValue;
            result.append(1, static_cast<char>(charValue - 100));
        }
        return result;
    }
    
    int main()
    {
        string test = str_to_num("Hallo Welt");
        cout << test << "\n";
        cout << num_to_str(test) << "\n";
    }
    


  • Ohne einen Hash nachher drüberlaufen zu lassen wird die Nummer halt u.U. sehr sehr lange sein, und man wird diverse Dinge sehr einfach rauslesen können, z.B. die MAC Adresse der Netzwerkkarte etc.
    Ob das so gut ist weiss ich nicht.



  • jeweils unterschiedliche strings sind bereits eine eindeutige zahl. nämlich eine zahl zur basis der anzahl der zeichen des verwendeten alphabets (bei alphanumerischen strings z.b. die basis 52). einfach in dezimal transformieren und man hat eine les- und speicherbare zahl.


Log in to reply