ed2k hashes mit php berechnen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ed2k hashes mit php berechnen

    Hallo
    Ich möchte mit php dynamisch ed2k links berechnen lassen, wie die aufgebaut sind weiß ich auch
    siehe: Wikipedia

    so jetzt hab ich das mal so geschrieben:

    PHP-Code:
    <?php
    function ed2k_hash($filename)
    {
        if (
    filesize($filename) <= 9728000)
        {
            return 
    hash_file("md4"$filename);
        }
        else
        {
            
    $file fopen($filename"rb");
            while (!
    feof($file))
            {
                
    $ed2k_hash .= hash("md4"fread($file9728000));
            }
            
    fclose($file);
            return 
    hash("md4"$ed2k_hash);
        }
    }
    ?>
    Aber der Hash der dann rauskommt stimmt nicht (ich hab emule die datei hashen lassen)
    Was mach ich falsch ?
    MFG
    Hazzard

  • #2
    Zeig mal beide Hashes
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Meine funktion: b31cdb277de66f5c7f4f6217571b5d1c
      emule: DA6E0E6D7AA4BD0D9431AFF6430097B8

      MFG
      Hazzard

      Kommentar


      • #4
        Sind alle Hashes falsch? Also auch die für 'kleine' Dateien?
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          nein nur hashes von dateien über 9728000 bytes

          Kommentar


          • #6
            Na, das ist doch schon mal was, hilft nur leider nicht. Entweder versuchst Du irgendwo mehr Informationen zu bekommen (eDonkey-Forum) oder du
            Das UNIX/Linux-Programm "md4sum" kann übrigens den ed2k-Link zu einer vollständig vorhandenen Datei ausgeben, hierzu dient der Parameter "-e".
            versuchst an den Source dieses Programms zu kommen.

            Du musst übrigens $ed2k_hash erst initialisieren, bevor Du $ed2k_hash .= verwenden kannst.
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              Also wenn ich $ed2k_hash initialisiere kommt der selbe hashwert heraus, also das ändert nichts. Dann hab ich mal nach dem md4sum quellcode gesucht und auch gefunden und zwar HIER. Ich hab mir den Quellcode auch mal angeschaut allerdings blick ich da nicht durch (ich hab von C eigentlich keine Ahnung). Falls irgendjemand zufällig lust hat sich den C Code anzuschauen wäre ich sehr dankbar (ist ja nicht allzulang).

              In nem emule forum wart ich noch auf Antwort.

              MFG Hazzard

              Kommentar


              • #8
                Was du hier machst ist auch nur fast richtig.
                Du hashst jeden Chunk einzeln (soweit korrekt), packst die hexadezimale Repräsentation dieser Hashwerte in einen großen String (soweit auch noch akzeptabel) und dann hashst du diesen String nochmal (mööööp).
                Wichtig ist hier die interne Repräsentation der Daten. So ein Hash besteht eigentlich aus 128 Bit (=16 Byte) und wird nur der Einfachheit halber als 32-stellige Hexadezimalzahl (2 Hexziffern = 1 Byte) dargestellt. In PHP sind die Rückgabewerte der Hash-Funktionen allerdings Strings (aus gutem Grund). Und so ein String besteht aus einem Byte je Zeichen (ASCII-Code). Der 32 Zeichen Hash-String besteht also aus 32 * 8 Byte = 256 Byte = 2048 Bit. Das ist offensichtlich viel mehr, als der Hash in Wirklichkeit hat. Und weil die Hash-Funktionen auf der Bit-Ebene arbeiten, macht es einen (im wahrsten Sinne des Wortes) großen Unterschied, ob du den tatsächlichen Hash, oder den String, der den Hash darstellt hashst.
                Du musst also erst deinen langen Hexadezimalstring wieder in eine Bitfolge zurückverwandeln, bevor du ihn hashst. Das geht z.B. mit der Funktion pack (die wird man übrigens immer und immer wieder brauchen, wenn man auf der Ebene der Bits und Bytes in PHP arbeiten möchte).

                Und weil das alles sehr kompliziert ist, hier mal ausnahmsweise die komplette, (hoffentlich) richtige Funktion:
                PHP-Code:
                function ed2k_hash($filename) {
                    if (
                filesize($filename) <= 9728000) {
                        return 
                hash_file('md4'$filename);
                    }
                    
                $file fopen($filename'rb');
                    
                $ed2k_hash '';
                    while (!
                feof($file)) {
                        
                $ed2k_hash .= hash('md4'fread($file9728000));
                    }
                    
                fclose($file);
                    return 
                hash('md4'pack('H*'$ed2k_hash));

                hopka.net!

                Kommentar


                • #9
                  Vielen vielen Dank
                  Jetzt funktionierts, ich hab bisher pack() noch nie verwendet und wäre nie drauf gekommen das man das hier brauchen könnte. Noch mal vielen Dank.

                  MFG Hazzard

                  Kommentar

                  Lädt...
                  X