9

集計された列のすべての値のチェックサムを計算したいと考えています。

言い換えれば、私は同等のことをしたい

md5(group_concat(some_column))

このアプローチの問題は次のとおりです。

  1. 非効率です。md5関数に渡す前に、列のすべての値を一時ストレージの文字列として連結する必要があります
  2. group_concat の最大長は 1024 で、それ以降はすべて切り捨てられます。

(疑問に思っている場合は、値の連結が一貫した順序であることを確認できますが、信じられないかもしれませんが、group_concat() はその中で order by 句を受け入れます。たとえば、group_concat(some_column order by some_column))

MySQL は、非標準のビットごとの集計関数 BIT_AND()、BIT_OR()、および BIT_XOR() を提供しています。これらは、この問題に役立つと思われます。この場合、列は数値ですが、文字列列でそれを行う方法があるかどうか知りたいです。

この特定のアプリケーションでは、チェックサムが暗号学的に安全である必要はありません。

4

4 に答える 4

7

次のクエリは、Percona の Mysql テーブル チェックサム ツールで使用されます。理解するのは少し難しいですが、基本的にCRC32は、すべての行の列 (または連結された列の束) であり、グループ関数XORを使用してそれらをすべてまとめます。BIT_XOR1 つの crc ハッシュが異なると、XORすべてを ing した結果も異なります。これは固定メモリで発生するため、任意の大きなテーブルをチェックサムできます。

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

ただし、これは衝突の可能性を防ぐものではなく、CRC32今日の基準では非常に弱い機能であることに注意してください。より良いハッシュ関数は、FNV_64. 2 つのハッシュを一緒に使用すると、互いに補完し合う可能性はほとんどありませんXOR

于 2013-04-15T19:22:53.227 に答える
5

暗号強度を気にしない場合は、crc32代わりに使用する方がよいようです。md5私はこう思います:

select sum(crc32(some_column)) from some_table;

文字列で動作します。MySQL が一時テーブルを作成する可能性があるため (特に を追加した場合order by)、非効率的である可能性があります。

于 2009-02-27T00:12:21.107 に答える
3
SELECT  crc
FROM
(
  SELECT @r := MD5(CONCAT(some_column, @r)) AS crc,
         @c := @c + 1 AS cnt
  FROM
    (
    SELECT @r := '', @c := 0
    ) rc,
    (
    SELECT some_column
    FROM mytable
    WHERE condition = TRUE
    ORDER BY
      other_column
    ) k
) ci
WHERE cnt = @c
于 2009-02-26T16:31:04.900 に答える
1

列が数値の場合、次のようにすることができます。

SELECT BIT_XOR(mycolumn) + SUM(mycolumn)

もちろん、これを無効にするのは簡単ですが、列のすべてのビットが含まれます。

于 2009-02-26T16:13:59.807 に答える