Erstellt eine Gesamtprüfsumme einer Spalte

8

Ich möchte eine Prüfsumme aller Werte einer Spalte in Aggregat berechnen.

Mit anderen Worten, ich möchte ein Äquivalent von

machen %Vor%

Das Problem mit diesem Ansatz ist:

  1. Es ist ineffizient. Es muss alle Werte der Spalte als Zeichenfolge in einem temporären Speicher enthalten, bevor es an die md5-Funktion
  2. übergeben wird
  3. group_concat hat eine maximale Länge von 1024, danach wird alles andere abgeschnitten.

(Falls Sie sich wundern, können Sie sicherstellen, dass die Concat der Werte in einer konsistenten Reihenfolge sind, da Group_concat () eine order by-Klausel akzeptiert, oder nicht, zB group_concat(some_column order by some_column) )

MySQL bietet die nicht standardmäßigen bitweisen Aggregatfunktionen BIT_AND (), BIT_OR () und BIT_XOR () an, von denen ich annehme, dass sie für dieses Problem nützlich wären. Die Spalte ist in diesem Fall numerisch, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, dies mit String-Spalten zu tun.

Für diese spezielle Anwendung muss die Prüfsumme nicht kryptologisch sicher sein.

    
ʞɔıu 26.02.2009, 16:10
quelle

4 Antworten

2

Es scheint, als ob Sie crc32 anstelle von md5 verwenden könnten, wenn Sie sich nicht um die kryptographische Stärke kümmern. Ich denke das:

%Vor%

würde auf Strings funktionieren. Es könnte ineffizient sein, da MySQL möglicherweise eine temporäre Tabelle erstellen würde (besonders wenn Sie order by hinzugefügt haben).

    
Jacob Gabrielson 27.02.2009, 00:12
quelle
4

Die folgende Abfrage wird in Perconas Mysql Table Checksumming Tool verwendet. Es ist ein wenig schwer zu verstehen, aber im Wesentlichen ist es CRC32 s die Spalte (oder eine Reihe von Spalten concatted) für jede Zeile, dann XOR s sie alle zusammen mit der BIT_XOR Gruppenfunktion. Wenn ein CRC-Hash unterschiedlich ist, wird das Ergebnis von XOR ing auch anders sein. Dies geschieht im festen Speicher, so dass Sie beliebig große Tabellen mit Prüfsummen erstellen können.

SELECT CONV(BIT_XOR(CAST(CRC32(column) AS UNSIGNED)), 10, 16)

Beachten Sie jedoch, dass dies mögliche Kollisionen nicht verhindert, und CRC32 ist nach heutigem Standard eine ziemlich schwache Funktion. Eine schönere Hashfunktion wäre etwas wie FNV_64 . Es wäre sehr unwahrscheinlich, zwei Hashes zu haben, die sich ergänzen, wenn XOR ed zusammen ist.

    
Yarek T 15.04.2013 19:22
quelle
3
%Vor%     
Quassnoi 26.02.2009 16:31
quelle
1

Wenn die Spalte numerisch ist, können Sie dies tun:

%Vor%

Natürlich ist das leicht zu besiegen, aber es enthält alle Bits in der Spalte.

    
Jason Cohen 26.02.2009 16:13
quelle

Tags und Links