Zwei Werte zu einer eindeutigen Zahl verknüpfen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zwei Werte zu einer eindeutigen Zahl verknüpfen

    Ich habe eine Warennummer und eine Unterwarennr. Würde man beide Zeichenketten konkatenieren, ergäbe sich in der Datenbanktabelle ein eindeutiger Wert. Dummerweise enthalten beide Felder nicht nur Ziffern, sondern alles, was die Tastatur hergibt. Beide Felder müssen nun zu einer Zahl verschmolzen werden, um später damit u.a. einen Barcode erzeugen zu können.

    Beispiel:

    Warennr. = T13-A *
    U-Warennr= 7Y OÜG

    Hat da jmd. einen Ansatz für mich, wie man das programmieren könnte?
    Wenn du aber doch mit Datenbank arbeitest, sollte deine Waren-Nummer doch mit der Unterwaren-Nummer in Relation stehen
    und du hättest die eindeutige ID direkt zur Hand....
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @Zenker Ein Barcode ist nix anderes als ein Text mit einem Barcode-Font.
    Du kannst also in einem Word-Dokument einen Text schreiben, diesen markieren und formatieren: "Arial", "Courier New", "Barcode123".
    Überdenke das und formuliere Dein Problem noch einmal neu.

    ======
    Wenn Dein Problem darin besteht, dass der Barcode-Zeichensatz nicht alle Zeichen abdeckt, wäre die Konvertierung Deines Textes zu einem Base64String eine mögliche Lösung.
    Und:
    Genügt es, dass die Verknüpfung eindeutig ist odere sollte sie nicht eineindeutig sein? Auch in diesem Falle wäre der Base64String Dein Kandidat.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    ErfinderDesRades schrieb:

    Wie kollisionssicher ist denn SHA
    Ein Hash, der kürzer als der Eingabestring ist, ist theoretisch nie vollständig kollisionsresistent, auch nicht SHA, nur ist die Chance auf eine Kollision ziemlich gering.
    Unter anderem deshalb ist ein Hash ja auch keine umkehrbare Verschlüsselung.
    de.wikipedia.org/wiki/Kollisionsresistenz
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    tja, was KollisionsResistenz ist habich so ungefähr ja schon gewusst.
    Meine Frage waraber: : Wie kollisionssicher sind Sha, Md5, String.GetHashCode() im Vergleich?
    Da muss es doch eine Masseinheit für geben, wenn gesagt werden kann: "Dieses ist sicher, jenes nicht."

    Und am Ende geht es um infinitisimal kleine GrößenOrdnungen, also die Wahrscheinlichkeit einer MD5-Kollision mag sein: 1:10^-100, und bei Sha isses 1:10^1000 - aber wen interessiert das denn dann noch?
    Beides wird, solange die Menschheit noch existiert, niemals auftreten.

    ErfinderDesRades schrieb:

    Meine Frage waraber: : Wie kollisionssicher sind Sha, Md5, String.GetHashCode() im Vergleich?

    Ich glaube das ist schwer zu sagen. SHA ist ja nur eine Gruppe und wenn du da entsprechend neuere nimmst, wird das schon passen. MD5 würde ich nicht nehmen. String.GetHashCode braucht man gar nicht erst betrachten, das ist ein int der hat ja nur 4 Bytes, da wirst du sicher Kollisionen bekommen. Außerdem darfst/solltest du diesen gar nicht abspeichere, da dieser nicht persistent ist und sich ändern kann:
    ​The GetHashCode method for an object must consistently return the same hash code as long as there is no modification to the object state that determines the return value of the object's Equals method. Note that this is true only for the current execution of an application, and that a different hash code can be returned if the application is run again.

    Object.GetHashCode Method
    Why is string.GetHashCode() different each time I run my program in .NET Core?

    Hier mal die Tabelle mit den Größen aus Wikipedia:

    SHA-3 mit mindestens 28 Byte wird vermutlich ziemlich sicher sein.

    ErfinderDesRades schrieb:

    Und am Ende geht es um infinitisimal kleine GrößenOrdnungen, also die Wahrscheinlichkeit einer MD5-Kollision mag sein: 1:10^-100, und bei Sha isses 1:10^1000 - aber wen interessiert das denn dann noch?
    Beides wird, solange die Menschheit noch existiert, niemals auftreten.


    Bei MD5 ist es schon aufgetreten und wenn du danach googelst, wirst du auch entsprechend Beispiele finden. Diese beiden Bilder haben z.B. den selben MD5:



    Klar, bei den kürzeren Strings ist das schon unwahrscheinlicher, aber ich würde SHA-3 nehmen oder mir einen ganz anderen Ansatz überlegen.

    Zenker schrieb:

    Würde man beide Zeichenketten konkatenieren, ergäbe sich in der Datenbanktabelle ein eindeutiger Wert.


    RodFromGermany schrieb:

    Ein Barcode ist nix anderes als ein Text


    Bluespide schrieb:

    ich würde SHA-3 nehmen oder mir einen ganz anderen Ansatz überlegen


    Jo, also String.GetHashCode scheidet aus, zumindest in .NetCore.
    Dann kann man einen der anderen nehmen - warum nicht SHA - kostet auch nicht mehr als MD5.
    Theoretisch ginge wohl auch MD5, weil es geht ja nicht um Abwehr von iwelchen Angriffen, sondern nur um eine hinreichend kollisionsArme Zahl zu erhalten.
    Wobei ich garnet weiss, ob MD5, SHA überhaupt Zahlen ausgeben - ich lese was von Output 128 bit, oder 224, oder 256, oder 512 - Zahlen sind das auf keinen Fall.

    Also gerne anderen Ansatz überlegen: Spricht etwas dagegen, die Strings tatsächlich aneinanderzuhängen und so dann auch in die Db zu speichern?
    Mein Chef sagt, heutzutage kann man vonne Performance her in einer Datenbank TEXT ebensogut als Primärschlüssel hernehmen wie INT.