Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 13:06

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme bei nem hash generator tool
BeitragVerfasst: Sa Jan 10, 2009 19:21 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich bin grad dabei ne hash klasse zu bauen, mit welcher ich ED2K hashes berechnen kann.
Dies benötige ich um Datenbestände zu Katalogisieren.

Im Wikipedia ist das ganze so beschrieben:

- Man teile eine datei in blöcke, welcher jeder block eine bestimmte byte grösse hat.
- Man berechne für jeden block einen MD4 hash wert.
- Man fügt den berechneten hash wert einer hash liste hinzu
- Man berechnet aus allen hashen in der liste, einen finalen MD4 hash. Dies ist der ed2k hash.

Klingt einfach ich krieg es einfach nicht hin, ich bräuchte ein wenig hilfe beim umsetzten.

Implementiert hab ich das ganze zwar, aber mein ergebniss ist falsch.
Ich teste es mit closed source hash tools um meine werte zu überprüfen.

Hier ist die ed2k hash klasse, die fehlerlos funktioniert aber nicht stimmt und ich nicht weiss warum.
Ich zerbrech mir schon seit tagen den kopf.

Code:
  1.  
  2. using System;
  3. using System.Collections;
  4. using System.IO;
  5. using System.Security.Cryptography;
  6.  
  7. namespace HashTest
  8. {
  9.     public class ED2K
  10.     {
  11.         public ED2K()
  12.         {
  13.         }
  14.  
  15.         private String ByteArrayToString(byte[] arr)
  16.         {
  17.             String res = "";
  18.             foreach (byte thisb in arr)
  19.             {
  20.                 String hex = Convert.ToString(thisb, 16);
  21.                 res += hex;
  22.             }
  23.             return res;
  24.         }
  25.  
  26.         public String ComputeHash(String filename)
  27.         {
  28.             String res = "";
  29.  
  30.             FileInfo fi = new FileInfo(filename);
  31.             if (fi.Exists)
  32.             {
  33.                 MemoryStream ed2k = new MemoryStream();
  34.  
  35.                 using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
  36.                 {
  37.                     long filesize = stream.Length;
  38.  
  39.                     const int chunk = 9728000;
  40.  
  41.                     double numchunks = (double)filesize / (double)chunk;
  42.                     int sizedc = (int)Math.Ceiling(numchunks) + 1;
  43.                     if (filesize % chunk == 0) sizedc--;
  44.  
  45.                     for (int i = 1; i <= sizedc; i++)
  46.                     {
  47.                         int readsize;
  48.                         if (i == sizedc)
  49.                             readsize = (int)filesize % chunk;
  50.                         else
  51.                             readsize = chunk;
  52.  
  53.                         byte[] tempbuffer = new byte[readsize];
  54.                         stream.Read(tempbuffer, 0, readsize);
  55.  
  56.                         HashAlgorithm md4temp = MD4.Create();
  57.                         byte[] singledigest = md4temp.ComputeHash(tempbuffer);
  58.  
  59.                         ed2k.Write(singledigest, 0, 16);
  60.  
  61.                         String hashstr = ByteArrayToString(singledigest);
  62.                         Console.WriteLine(String.Format("Chunk[{0}]: " + hashstr, i));
  63.                     }
  64.  
  65.                     stream.Close();
  66.                 }
  67.  
  68.                 ed2k.Seek(0, SeekOrigin.Begin);
  69.                 HashAlgorithm hash = MD4.Create();
  70.                 byte[] digest = hash.ComputeHash(ed2k);
  71.  
  72.                 res = ByteArrayToString(digest);
  73.                 Console.WriteLine("ED2K Hash: " + res);
  74.             }
  75.  
  76.             return res;
  77.         }
  78.     }
  79. }
  80.  


Vielen dank,
Final


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 10, 2009 22:13 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Yay ich habs rausgefunden, nachdem ich mit emule nachgeprüft habe, wieviel hash blöcke für meine testdatei gab ;)

Hatte einfach einen block zuviel, wegen dieser zeile:

Code:
  1.  
  2.                     double numchunks = (double)filesize / (double)chunk;
  3.                     int sizedc = (int)Math.Ceiling(numchunks) + 1;
  4.  


Wurde ersetzt durch

Code:
  1.  
  2.                     int sizedc = ((int)filesize / CHUNKSIZE) + 1;
  3.  


Dann gehts ;-)

Thread bitte schliessen! Danke.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]