Mysql - Erkennen von Änderungen in Daten mit einer Hash-Funktion über einen Teil der Tabelle

8

Ich brauche einen Hash für einige Daten in einer Tabelle

%Vor%

d. F1, F3, FN mit F2 = 10

%Vor%

Gibt für jede Zeile in der Tabelle einen Hashwert an.

FRAGEN

1) Wie erhalten Sie einen einzigen Hash über die gesamte Tabelle?

2) Was ist der Fast-Hash-Algorithmus, um MD5, SHA1, SHA oder andere zu verwenden?

BEARBEITEN:

Mysql 4.1 wurde verwendet - und NICHT hat Trigger-Unterstützung

    
Charles Faiga 23.06.2010, 15:15
quelle

6 Antworten

10

1)

%Vor%

2) Geschwindigkeit spielt keine Rolle, da eine Funktion nur einmal ausgeführt werden muss und alle Hash-Funktionen schnell genug sind

    
Naktibalda 23.06.2010 15:35
quelle
6

Was die Geschwindigkeit betrifft, sollten Sie es versuchen. Es hängt davon ab, wie die Funktionen implementiert sind.

Allerdings werden Sie sehr geringe Geschwindigkeitsunterschiede sehen. Die Hash-Funktionen, die Sie nennen, sind alle schneller als das, was eine durchschnittliche Festplatte ausgeben kann. Daher stellt sich nicht die Frage, welche Hash-Funktion den Code am schnellsten laufen lässt. aber "welche Hash-Funktion macht die CPU am meisten untätig, während sie auf die Daten von der Platte wartet?".

Auf meinem Intel Core2 Q6600, getaktet mit 2,4 GHz (64-Bit-Modus), mit meiner eigenen C-Implementierung von Hash-Funktionen, bekomme ich die folgenden Hash-Geschwindigkeiten:

  • MD5: 411 MB / s
  • SHA-1: 336 MB / s
  • SHA-256: 145 MB / s
  • SHA-512: 185 MB / s

Das verwendet nur einen einzelnen Kern. Meine Festplatten haben eine Spitzenleistung von ca. 100 MB / s. Man kann also sagen, dass selbst mit SHA-256 der Hash-Prozess nicht mehr als 17% der CPU-Leistung der Maschine verbraucht. Natürlich garantiert nichts, dass die von MySQL verwendete Implementierung so schnell ist, weshalb Sie es versuchen sollten. Auch im 32-Bit-Modus nimmt die Leistung von SHA-512 erheblich ab.

Kryptographisch gesehen wurden (schwerwiegende) Schwachstellen in MD5 und SHA-1 gefunden, also wenn Sie in einer sicherheitsrelevanten Umgebung arbeiten (dh Sie wollen Änderungen erkennen, selbst wenn es jemanden gibt, der einige der Änderungen auswählen kann und würde bevorzugen, dass Sie diese Änderungen nicht bemerken), sollten Sie sich an SHA-256 oder SHA-512 halten, die, soweit wir wissen, robust genug sind. MD5 und SHA-1 sind jedoch auch in nicht sicherheitsrelevanten Situationen immer noch in Ordnung.

    
Thomas Pornin 25.06.2010 14:39
quelle
3

Ich würde einen MySQL-Trigger verwenden, um Änderungen beim Einfügen, Löschen und Aktualisieren zu erkennen usw.

    
labratmatt 23.06.2010 15:38
quelle
2

Obwohl dieser Thread alt ist, ist es vielleicht das, was du brauchst: Ссылка

    
kraftb 25.08.2014 13:22
quelle
1

Wenn aus irgendeinem Grund keine Trigger verwendet werden können, verwenden Sie die Option CONCAT wie:

%Vor%

Beachten Sie jedoch, dass die Abfrage langsam ist, wenn die Tabelle Daten enthält. Wenn möglich, versuchen Sie unnötige Spalten von der CONCACT auszuschließen.

Beachten Sie auch, dass MySQL Max CONCACT standardmäßig 1024 ist. Möglicherweise müssen Sie dies ändern, indem Sie zuerst die folgende Abfrage ausführen:

%Vor%

Beachten Sie, dass 18446744073709547520 der Maximalwert ist, Sie könnten einen anderen Wert verwenden!

    
Slipstream 04.11.2014 11:15
quelle
0

Siehe BIT_XOR: Ссылка "Gibt die bitweise XOR aller Bits in Ausdruck zurück. Die Berechnung wird mit 64-Bit-Genauigkeit (BIGINT) durchgeführt. Diese Funktion gibt 0 zurück, wenn keine übereinstimmenden Zeilen vorhanden waren." Ein Beispiel für die Verwendung finden Sie unter pt-table-sync.

    
Ruud H.G. van Tol 22.09.2014 07:36
quelle

Tags und Links