MD5 Hash Code generieren

26. Januar 2018 16:04

Hallo zusammen,

ich möchte zu allen Datensätzen einer Tabelle einzelne MD5 Werte generieren um diese nachher auf ihre "Version" zu überprüfen...
Die String-Zusammensetzung in der Schleife funktioniert. In die Zieltabelle wird mir auch ein berechneter HashKey je Zeile eingetragen. Allerdings für jeden Datensatz IMMER der gleiche HashKey.

Folgenden Code haben wir bisher gebastelt:

Folgenden Code haben wir bisher gebastelt:

Code:
IF REC.FIND('-') THEN
  REPEAT
    REC.CALCFIELDS("Hash BLOB");
    CLEAR(REC."Hash BLOB");
    REC.MODIFY;
    REC."Hash MD5" := '';
    CLEAR(Test);
    CLEAR(Ostream);
    CLEAR(SInStream);
    Text := FORMAT(REC);                 
    BIGTEXTvariable.ADDTEXT(Text);
    REC."Hash BLOB".CREATEOUTSTREAM(Ostream);
    BIGTEXTvariable.WRITE(Ostream);
    REC.CALCFIELDS("Hash BLOB");
    IF REC."Hash BLOB".HASVALUE THEN BEGIN                     
      REC."Hash BLOB".CREATEINSTREAM(SInStream);
      CLEAR(BIGTEXTvariable);
      BIGTEXTvariable.READ(SInStream);
      MESSAGE('%1',BIGTEXT);       //MESSAGES nur zu Testzwecken !!
      MD5 := MD5.Create();
      MD5.ComputeHash(SInStream);
      HashKey := BTcon.ToString(MD5.ComputeHash(SInStream));
      HashKey := DELCHR(HashKey, '=', '-');
      REC."Hash MD5" := HashKey;
      MESSAGE('%1',HashKey);
      REC.MODIFY;           
    END;
  UNTIL REC.NEXT = 0;



Ich freue mich über Hilfe.. wir verzweifeln langsam :roll:

Danke vorab.

Re: MD5 Hash Code generieren

26. Januar 2018 16:49

Dein Code sieht ein wenig danach aus als wenn du einfach alles zusammen kopiert hast was du zu dem Thema gefunden hast.
Versuch zu verstehen was du schreibst.
Wenn der HashKey der gleiche ist heißt das das der Wert der "gehasht" wird bei allen Datensätzen der gleiche ist.

Um dir fix unter die Arme zu greifen, der Code macht was du brauchst, du solltest dennoch verstehen wieso weshalb da was gemacht wird.
Code:
OBJECT Codeunit 50094 MD5Test
{
  OBJECT-PROPERTIES
  {
    Date=26.01.18;
    Time=15:45:17;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=VAR
            Customer@1000000000 : Record 18;
            MD5Old@1000000001 : Text;
          BEGIN
            Customer.FINDSET;
            REPEAT
              MD5Old := Customer.MD5;
              Customer.MD5 := '';
              Customer.MD5 := GenerateMD5(FORMAT(Customer)));
              IF Customer.MD5 <> MD5Old THEN
                Customer.MODIFY;
            UNTIL Customer.NEXT = 0;
          END;

  }
  CODE
  {

    LOCAL PROCEDURE GenerateMD5@1000000003(Text@1000000000 : Text) MD5Text : Text;
    VAR
      MD5@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Security.Cryptography.MD5";
      BTcon@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.BitConverter";
      InStream@1000000003 : InStream;
      OutStream@1000000005 : OutStream;
      TempBlob@1000000004 : TEMPORARY Record 99008535;
    BEGIN
      TempBlob.Blob.CREATEOUTSTREAM(OutStream);
      OutStream.WRITE(Text);
      TempBlob.Blob.CREATEINSTREAM(InStream);

      MD5 := MD5.Create();
      MD5.ComputeHash(InStream);
      MD5Text := BTcon.ToString(MD5.ComputeHash(InStream));
      MD5Text :=DELCHR(MD5Text, '=', '-');
    END;

    BEGIN
    END.
  }
}

Re: MD5 Hash Code generieren

29. Januar 2018 15:13

Hallo...
es ist in der Tat so, dass ich viel recherchiert habe und auch einiges "zusammen kopiert" habe.
Ich "nutze" NAV (und auch die Entwicklungsumgebung) ohne jegliche Vorkenntnisse, bzw. arbeite mich seit ca. einem Jahr ein und nehme daher jede Hilfe an, wenn ich diese brauche.

Die Datensätze sind durchaus unterschiedlich und müssen Zeile für Zeile, bzw. Datensatz für Datensatz auf ihre "Version" geprüft und verglichen werden.
Im Grunde "If rec <> xrec dann Datensatz überschreiben".

Re: MD5 Hash Code generieren

25. Februar 2020 13:04

Ted hat geschrieben:Dein Code sieht ein wenig danach aus als wenn du einfach alles zusammen kopiert hast was du zu dem Thema gefunden hast. [...]
Um dir fix unter die Arme zu greifen, der Code macht was du brauchst, du solltest dennoch verstehen wieso weshalb da was gemacht wird.


Der Code erzeugt bei mir nicht den erwarteten MD5 Hash.
Gegenprüfung mit: https://www.md5hashgenerator.com/

Mit den folgenden Änderungen erhalten ich den erwarteten MD5 Hash:

Code:
LOCAL PROCEDURE GenerateMD5@1000000011(String@1000000004 : Text) : Text;
    VAR
      MD5@1000000003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Security.Cryptography.MD5";
      BTcon@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.BitConverter";
      MD5String@1000000006 : Text;
      MemoryStream@1000000007 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      Encoding@1000000008 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Text.UTF8Encoding";
      Bytes@1000000010 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
    BEGIN
      MemoryStream := MemoryStream.MemoryStream;
      Encoding := Encoding.UTF8Encoding();
      Bytes := Encoding.GetBytes(String);
      MemoryStream.Write(Bytes,0,Bytes.Length);
      MemoryStream.Position := 0;

      MD5 := MD5.Create;
      MD5String := BTcon.ToString(MD5.ComputeHash(MemoryStream));
      MD5String := DELCHR(MD5String, '=', '-');
      MD5String := LOWERCASE(MD5String);
      EXIT(MD5String);
    END;

Re: MD5 Hash Code generieren

26. Februar 2020 20:15

besi22 hat geschrieben:...
Die Datensätze sind durchaus unterschiedlich und müssen Zeile für Zeile, bzw. Datensatz für Datensatz auf ihre "Version" geprüft und verglichen werden.
Im Grunde "If rec <> xrec dann Datensatz überschreiben".

Du kannst auch
Code:
FORMAT(Rec) = FORMAT(xRec)

verwenden.