MD5 Hash Code generieren

Bild Microsoft Dynamics NAV 2016

MD5 Hash Code generieren

Beitragvon besi22 » 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: Alles auswählen
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.
besi22
 
Beiträge: 18
Registriert: 4. Mai 2017 15:20
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2016

Re: MD5 Hash Code generieren

Beitragvon Ted » 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: Alles auswählen
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.
  }
}
GruĂź
Ted
Ted
 
Beiträge: 328
Registriert: 18. September 2014 11:16
Realer Name: Dennis Reinecke
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2015+

Re: MD5 Hash Code generieren

Beitragvon besi22 » 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".
besi22
 
Beiträge: 18
Registriert: 4. Mai 2017 15:20
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2016

Re: MD5 Hash Code generieren

Beitragvon Raik Zobel » 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: Alles auswählen
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;
Benutzeravatar
Raik Zobel
 
Beiträge: 279
Registriert: 4. März 2013 13:43
Realer Name: Raik Zobel
Arbeitsort: Leipzig
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 4.00SP3, 2013R2, 2016

Re: MD5 Hash Code generieren

Beitragvon m_schneider » 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: Alles auswählen
FORMAT(Rec) = FORMAT(xRec)

verwenden.
MfG Michael
Benutzeravatar
m_schneider
 
Beiträge: 2141
Registriert: 20. Januar 2009 14:36
Realer Name: Michael Schneider
Arbeitsort: Treuen
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2017


ZurĂĽck zu NAV 2016

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast