• das wurde in der letzten vorlesung durchgenommen und ist u.a. gegenstand der übungsbeispiele
    ich blick da überhaupt nicht durch
    kann mir das jemand idiotensicher erklären, was das überhaupt genau ist und wie man es im programm umsetzt bzw. wisst ihr websites, wo das gut erklärt ist?

  • ein hash ist ein code der bestimmte daten eindeutig identifizieren soll

    es gibt etwas das heißt hashalgorithmen von denen MD5 zb ein ganz bekannter ist, diese generieren über eine meist große datenfolge (zb ein bild, eine zeichenkette usw) einen viel kleineren hash der trotzdem die eigenschaft hat dass er einzigartig ist

    wenn ich zb den string "das ist ein test!" hashe kommt dabei raus -1100477139
    wenn ich nur einen buchstaben änder, zb "das ist kein test!" wird der hash so: -2018157948

    das ist noch eine eigenschaft von hashes, kleine änderungen im der datenmenge über die er gebildet wird bewirken dass sich der hash überhaupt ganz ändert

    wofür werden hashes jetzt vernwendet?
    wenn du beispielsweise auf manchen seiten exe files zum runterladen hast sieht du manchmal daneben so nen komischen langen string mit zahlen und buchstaben, das ist ein hash der über die exe gebildet wurde, wenn du die exe file von einem mirror runterladest kannst du selbst einen hash drüberlaufen lassen und wenn der nicht mit dem referenzhash auf der anbieterseite übereinstimmt dann ist es nicht dieselbe exe file (andere version, jemand hat nen virus reingetan etc)

    eine weitere verwendungsmöglichkeit von hashes währe beispielsweise wenn du ein programm hast das bilder in den speicher ladet, jedesmal wenn du ein bild reinladest hashst du den inhalt und vergleichst den hash mit allen hashes der schon geladenen bilder, wenn es bereits einen hash gibt der gleich ist wie der mit dem du vergleichst weisst du dass das bild schon im speicher ist und ladest es nicht mehr neu rein

    es gibt auch etwas das sich hash table nennt, das ist mehr oder weniger ein array dessen elemente immer wertepaare sind, ein paar enthält einen hash (id) und den wert mit dem der hash assoziiert wird dabei müssen nich zwangsläufig wirklich die hashes über den wert gebildet werden sondern als hash/id kann auch einfach eine zahl genommen werden die immer erhöht wird

    also ganz kurz gefasst, hash = relativ kleine zahl (bei md5 128 bit) die eine beliebig große datenmenge (beispielsweise eine 10mb große bitmap) eindeutig identifiziert

    hashalgorithmus -> wird verwendet um über die datenmenge einen hash zu erzeugen

    wenn du das in c# machst gibts beispielsweise für jedes objekt einfach ne methode .GetHashCode() die dir den hash holt, in c/cpp würde ich mal in der std schauen obs da nicht sowas gibt ansonsten gibt es sicher genügend libs die du einfach inkludieren kannst und über ne funktion nen md5 hash über einen char* buffer an daten bilden kannst

    alleine würd ich sowas nicht implementieren.. wozu auch wenns das schon tausendfach besser ausgeführt gibt

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • vielen dank, das war echt eine super erklärung :)
    jetzt kapier ich endlich, was ein hash überhaupt ist
    selber implementieren müssen wir das auch nicht, nur anwenden und natürlich beim test theoretische fragen dazu beantworten

  • ich bin total frustriert. beim blatt drei hab ich noch was gekonnt und jetzt bei blatt 4 check ich gar nix. ich versteh nicht, wieso ichs net check. ich versteh ja die theorie des ganzen. aber bei den beispielen blick ich nimmer durch. nicht mal bei den ersten beiden.

    • Lesen Sie beliebig viele (max. 50) Zahlen (Abschluss mit dem Wert 0) ein, speichern Sie diese in einem Feld und geben Sie Mittelwert, Median und die Standardabweichung der Zahlen aus. (Bei der Ermittlung der Medians können Sie davon ausgehen, dass die Zahlen schon sortiert sind, vom Benutzer also entweder in aufsteigender oder in fallender Reihenfolge eingegeben werden.)
    • Bestimmen Sie alle Primzahlen bis zu einem gegebenen n mit Hilfe des Siebs des Eratosthenes.

    Wer FU sagt, muss auch T sagen

  • hallo, ich hab mal das erste beispiel gemacht in c++.. oder eigentlich c... naja c ist es aber nicht weil die std verwendet wird und das ist c++ aber egal..

    jedenfalls hab ich keine klassen gemacht oder so sondern nur funktionen und alles in eine .cpp datei reingetan auch ohne .h dateien weil ich nicht wiess wie weit ihr seit

    das ganze ist überfüllt mit kommtentaren die wirklich fast jeden mist erklären sollten

    ka allerdings wie das zweite beispiel gehen soll weil ich ka hab was dieses siebdings sein soll und auch keine lust, aber

    wenn ihr rausfinden wollt ob eine zahl eine primzahl ist geht das eigentlich ganz einfach so, vielleicht ist das ja eh gemeint

    also irgendwas in die richtig


    irgendwie so müsste das gehen, falls ihr es nicht versteht dann lest euch beispiel #1 durch danach sollte das klar sein


    achja, und ich wollte euch noch fragen in welchem semester ihr seid und was ihr studiert
    wir machen nämlich in eprog 1 semester wo es ja für alle informatik studien gleich ist java und ich würde eigentlich
    auch viel lieber c++ machen und das ist ja das informatik studien forum für eprog etc oder bin ich hier falsch?!

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.


  • achja, und ich wollte euch noch fragen in welchem semester ihr seid und was ihr studiert
    wir machen nämlich in eprog 1 semester wo es ja für alle informatik studien gleich ist java und ich würde eigentlich
    auch viel lieber c++ machen und das ist ja das informatik studien forum für eprog etc oder bin ich hier falsch?!

    studierst du auf der univie: c(++)
    studierst du auf der tu: java

  • Geht's hier um "Einführung in die Programmierung, PR" an der Uni Wien?
    Wenn ja, dann verschieb ich das dort hin.

    Otto: Apes don't read philosophy. - Wanda: Yes they do, Otto, they just don't understand
    Beleidigungen sind Argumente jener, die über keine Argumente verfügen.
    «Signanz braucht keine Worte.» | «Signanz gibts nur im Traum.» 

    Das neue MTB-Projekt (PO, Wiki, Mitschriften, Ausarbeitungen, Folien, ...) ist online
    http://mtb-projekt.at

  • ein hash ist ein code der bestimmte daten eindeutig identifizieren soll

    hmm.. ich weiß nicht, ob du es so gemeint hast, aber für mich kommt deine formulierung etwas missverständlich herüber.
    ein hash-wert ist nicht eindeutig, sondern mehrdeutig. es gibt mehrere inputs, die sich auf ein und denselben hash-wert abbilden lassen. daher kann man einen string, ein file oder einen anderen input nicht an seinem hash-wert identifizieren.

    hash-werte können dazu genutzt werden die suche nach werten zu beschleunigen, oder datenübertragungsfehler aufzuspüren oder passwörter mehr oder weniger sicher abzuspeichern.

    wie hashing funktioniert steht unter anderem hier:
    http://en.wikipedia.org/wiki/Hash_function

    und zu md5 steht auch etwas:
    http://en.wikipedia.org/wiki/Md5

    Otto: Apes don't read philosophy. - Wanda: Yes they do, Otto, they just don't understand
    Beleidigungen sind Argumente jener, die über keine Argumente verfügen.
    «Signanz braucht keine Worte.» | «Signanz gibts nur im Traum.» 

    Das neue MTB-Projekt (PO, Wiki, Mitschriften, Ausarbeitungen, Folien, ...) ist online
    http://mtb-projekt.at


  • ein hash-wert ist nicht eindeutig, sondern mehrdeutig. es gibt mehrere inputs, die sich auf ein und denselben hash-wert abbilden lassen. daher kann man einen string, ein file oder einen anderen input nicht an seinem hash-wert identifizieren.

    hash-werte können dazu genutzt werden die suche nach werten zu beschleunigen, oder datenübertragungsfehler aufzuspüren oder passwörter mehr oder weniger sicher abzuspeichern.

    äh.. ist nicht genau das der punkt bei hashes, dass es keine 2 inputs gibt die denselben hash ergeben, das ist ja der sinn davon

    "daher kann man einen string etc nicht an seinem hash wert identifizieren" und nen absatz darauf steht da dass passwörter so sicher abgespeichert werden können

    wozu sollte ich ein passwort als hash abspeichern wenn ich
    a) ein zweites passwort oder mehrere passwörter hätte die denselben hash ergeben
    b) ich das referenzpasswort nicht identifizieren könnte am hash

    drum geht es doch überhaupt zb beim CHAP protokoll, der server hat die passworter abgespeichert, er schickt mir ne challenge die ich zum hashen meines pws verwende, verschicke das gehashte pw und der server hasht das pw was er in der datenbank hat ebenfalls mit der challenge und vergleich die hashes
    wenn jemand die challenge und den hash mitgesnifft haben sollte nützt ihm das nix weil er den hash nicht rückgängig machen kann

    also inwiefern kann man eine datenmenge nicht am hash identifizieren? man hasht sie einfach nochmal und vergleicht die 2 hashes und hat sie identifiziert, man muss nur wissen mit welchem hash algorithmus

    ---

    ich verstehe nicht wieso man an der normalen uni c++ macht und an der tu java.. was ist da der hintergrundgedanke dabei wenn es sowieso derselbe stoff ist ca?

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • äh.. ist nicht genau das der punkt bei hashes, dass es keine 2 inputs gibt die denselben hash ergeben, das ist ja der sinn davon


    Nein. Wie auch? Ein MD5-Hash enthält 128 Bits, es gibt also nur 2^128 unterschiedliche Hash-Werte. Wenn ich 2^128 + 1 unterschiedliche Dokumente mit MD5 hashe, müssen zumindest zwei verschiedene den selben Hash-Wert erhalten. (Das bitte als Gedankenexperiment verstehen, ich weiß, daß 2^128 eine sehr große Zahl ist.)

    Zitat

    "daher kann man einen string etc nicht an seinem hash wert identifizieren" und nen absatz darauf steht da dass passwörter so sicher abgespeichert werden können


    Die Idee bei der Speicherung von Passwörtern als Hash ist, daß erstens das Passwort aus dem Hash nicht in vertretbarer Zeit herausgefunden werden kann, und es zweitens aber mit sehr hoher Wahrscheinlichkeit nicht zu einer Kollision kommt, d.h. zu einem Fall, wo jemand ein falsches Passwort eingibt, das aufgrund des korrekten Hashwerts als richtig akzeptiert wird. Theoretisch möglich ist das aber schon.

    Hashing von Passwörtern funktioniert in der Praxis seit Jahrzehnten.

    Zitat

    also inwiefern kann man eine datenmenge nicht am hash identifizieren? man hasht sie einfach nochmal und vergleicht die 2 hashes und hat sie identifiziert, man muss nur wissen mit welchem hash algorithmus


    Wie gesagt, das ist probabilistisch: Es ist sehr sehr unwahrscheinlich, daß man zwei unterschiedliche Datenmengen findet, die den selben Hashwert haben. Diese sehr geringe Wahrscheinlichkeit wird für die Praxis als "gut genug" befunden.

    Ansonsten gäbe es keinen Unterschied zwischen Hashing und Verschlüsselung, hmm?

    Zitat

    ich verstehe nicht wieso man an der normalen uni c++ macht und an der tu java.. was ist da der hintergrundgedanke dabei wenn es sowieso derselbe stoff ist ca?


    Die Uni Wien kocht halt gern ihr eigenes Süppchen, die TU Wien kocht halt gern ihr eigenes Süppchen, das MIT machts mit Scheme als erster Sprache richtig, aber dort studieren wir halt nicht.

    *plantsch*

  • äh.. ist nicht genau das der punkt bei hashes, dass es keine 2 inputs gibt die denselben hash ergeben, das ist ja der sinn davon

    Überlegen wir uns das mal rein intuitiv: Ich lade mir ein CD-Image einer Linux-Distribution mit einer Größe von ungefähr 700 MB herunter. Um sicherzugehen, dass die Datei korrekt übertragen wurde, vergleiche ich die MD5-Summe, die auf der Downloadseite angegeben ist, mit der MD5-Summe, die ich aus dem CD-Image berechne.

    Und jetzt überlege mal: Wie viele Möglichkeiten gibt es, 700*10[h]24[/h] Bytes anzuordnen? Jedes Byte kann 256 verschiedene Werte annehmen, also erhalten wir nach Adam Riese 256[h]700*10[h]24[/h][/h] verschiedene Möglichkeiten.

    Der MD5-Hashwert ist 128 Bit lang, da hab ich 2[h]128[/h] unterschiedliche Werte, die auftreten können. Das ist etwas weniger als die oben bestimmte Anzahl der Anordnungen der Bytes eines CD-Images. Es ist daher unumgänglich, dass bei der Berechnung der MD5-Summe Kollisionen auftreten, d.h., die Hashfunktion mehrere Eingangswerte auf denselben Ausgangswert abbildet.

    Das Interessante an MD5 ist jedoch, dass eine geringfügige Änderung des Funktionsparameters den Hashwert komplett anders aussehen lässt. Wenn also in dem CD-Image irgendwo ein einzelnes Bit umfällt, erkenne ich das sofort am MD5-Hash. Dass genau jene Bits umfallen, die dazu führen, dass ich trotz der Fehler denselben Hashwert erhalte, ist _sehr_ unwahrscheinlich.

    Das ist jedoch nicht eigentliche Sinn von Hashing. Hashfunktionen werden für Datenstrukturen eingesetzt, wo ich Werte speichern möchte, die ich an Hand ihres Hashwertes referenzieren kann. Das erfolgt der von dir bereits erwähnten Hashtabelle, in der in die Zeile des Hashwertes der zu speichernde Wert eingetragen wird. Eine Hashfunktion ist jedoch grundsätzlich nicht bijektiv, man rechnet stets damit, dass Kollisionen auftreten. Für den Umgang mit diesen gibt es jedoch eine Reihe von Verfahren. Ich will an dieser Stelle jedoch nicht näher darauf eingehen - ich nehme an, du hast Algodat1 noch nicht gemacht; dort wirst du das dann im Detail lernen.

    "daher kann man einen string etc nicht an seinem hash wert identifizieren" und nen absatz darauf steht da dass passwörter so sicher abgespeichert werden können

    Passwörter sind um vieles kürzer als die oben erwähnten CD-Images, daher ist die Wahrscheinlichkeit von Kollisionen um vieles geringer, jedoch vorhnaden.

    wozu sollte ich ein passwort als hash abspeichern wenn ich
    a) ein zweites passwort oder mehrere passwörter hätte die denselben hash ergeben

    Das ist unwahrscheinlich, siehe oben.

    b) ich das referenzpasswort nicht identifizieren könnte am hash

    Der Punkt an einer Hashfunktion ist jener, dass sie nicht umkehrbar ist. Wenn du die MD5-Summe eines Passworts kennst, kennst du das Passwort selbst nicht. Du kannst aber überprüfen, ob es sich um den MD5-Hash eines bestimmten eingegebenen Passworts handelt, indem du die MD5-Hashfunktion auf die Eingabe anwendest und die beiden Hashwerte vergleichst - die müssen gleich sein. Es ist nicht möglich, aus dem MD5-Hash das Passwort zu rekonstruieren (du kannst ledigliche vollständige Enumeration über alle möglichen Passwörter anwenden, aber das ist nicht gerade effizient).

    Ein weiterer Punkt, der von Wings-of-Glory angesprochen wurde und der Grund für den Einsatz von Hashes beim Speichern von Passwörtern ist, ist jener, dass niemand das Passwort kennt - außer demjenigen, der sich mit dem Passwort authentifiziert. Sonst braucht es auch niemand zu kennen - kein Administrator und auch sonst keiner.

    ich verstehe nicht wieso man an der normalen uni c++ macht und an der tu java.. was ist da der hintergrundgedanke dabei wenn es sowieso derselbe stoff ist ca?

    Ob du an der "normalen" Uni C++ machst und an der "abnormalen" Uni Java, ist Geschmackssache. Es geht bei den Lehrveranstaltungen beider Unis weniger darum, eine bestimmte Programmiersprache zu lernen, sondern mehr darum, _überhaupt_ Programmieren zu lernen. Auch wenn zwischen den Programmiersprachen vielleicht Welten dazwischen liegen, wenn du bereits eine prozedurale/objektorientierte Programmiersprache gelernt hast, tust du dir viel leichter, eine weitere zu erlernen - die Grundkonzepte bleiben immer dieselben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!