AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String vergleichen mit Hash?

Ein Thema von stahli · begonnen am 27. Jun 2011 · letzter Beitrag vom 27. Jun 2011
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 09:01
Ich würde da MD4 empfehlen.
MD4 lässt sich schneller als MD5 errechnen.
MD4 ist heutzutage nicht mehr "en vogue", weil es möglich ist, für einen bestimmten Hashwert einen Klartext zu errechnen.
Das macht MD4 abgreifbar für Passwörter oder ähnliches.
Als reine Prüfsumme über ein Image jedoch ist es sehr gut geeignet.
Bei 128Bit Breite ist es in diesem Jahrtausend nicht zu erwarten, dass zwei unterschiedliche Bilder den gleichen Hashwert haben.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 12:02
Danke Euch.

Mit MD4 bin ich nicht weiter gekommen.

Und in ZLib ist crc32 offenbar von adler32 abgelöst worden.
Das habe ich einfach mal geetestet und es scheint wunderbar und schnell zu funktionieren.
(Intern wird das in ZLib scheinbar als Checksum im Compressverfahren genutzt.)

Delphi-Quellcode:
function TodPerson.GetPictureStream: TMemoryStream;
var
  P: PChar;
  C: LongInt;
begin
  P := PChar(Picture);
  C := adler32(0, P, Length(P));
// if Picture <> OldString then
  if C <> OldC then
  begin
    Base64ToMS(Picture, FPictureStream);
// OldString := Picture;
    OldC := C;
  end;
  FPictureStream.Seek(0, soBeginning);
  Result := FPictureStream;
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.260 Beiträge
 
Delphi 12 Athens
 
#3

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 12:51
Wenn es nicht nur "meistens" Gleich sein soll, sindern immer zu 100% identisch,
dann errechne den Hash und vergleiche erstmal damit,
ist der Hash gleich, dann nochmals die Daten direkt vergleichen.

Alleine mit CRC32 sollte damit eine enorme Geschwindigkeitssteigerung erreicht werden.

PS: CRC32 paßt in einen Integer und läßt sich somit schneller vergleichen, als MD5, SHA und Konsorten,
auch ist die Berechnung oftmals flotter.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 14:20
Mal eine Nebenfrage - warum wandelst du das Bild in Base64 um und erhälts dadurch eine Datenredundanz (Größenanstieg 133,3*%) - ist es nicht möglich, es direkt als Stream abzuspeichern?

Zum Problem mit der Datenredundanz: Falls du das Bild direkt Base64 - enkodierst, würde ich dir vorschlagen, zuerst den Datenstrom zu komprimieren und anschließend die Kodierung vorzunehmen.
Aber ich schätze mal, du machst das sowieso?!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#5

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 14:39
Wie wäre es mit zwei Hashs? Die false-positive Meldung kannst Du dann unter den Tisch kehren, denn entweder bist Du
a) nicht da
b) in Rente
c) im Urlaub.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: String vergleichen mit Hash?

  Alt 27. Jun 2011, 14:52
Mal eine Nebenfrage - warum wandelst du das Bild in Base64 um und erhälts dadurch eine Datenredundanz (Größenanstieg 133,3*%) - ist es nicht möglich, es direkt als Stream abzuspeichern?

Zum Problem mit der Datenredundanz: Falls du das Bild direkt Base64 - enkodierst, würde ich dir vorschlagen, zuerst den Datenstrom zu komprimieren und anschließend die Kodierung vorzunehmen.
Aber ich schätze mal, du machst das sowieso?!
Ich speichere die Daten in einer Textdatei (ggf. komprimiert) und lese die zur Laufzeit in Objekte. Die Binärdaten liegen daher erst einmal als String vor und dieser String wird von der GUI zur Darstellung verwendet.
Nach der Rückwandlung in einen Stream und Kopieren in ein Bitmap hatte ich den bisher Stream wieder freigegeben. Das wurde dann allerdings etwas langsam, wenn mehrere Bilder anzuzeigen sind.
Jetzt behalte ich den Stream und wandle nur neu um, wenn neue Daten (String) in dem verwendeten Objekt vorliegen.

So funktioniert jetzt alles wunderbar.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz