문제
골재로 열의 모든 값의 체크섬을 계산하고 싶습니다.
다시 말해, 나는 몇 가지를하고 싶습니다.
md5(group_concat(some_column))
이 접근법의 문제는 다음과 같습니다.
- 비효율적입니다. MD5 함수로 전달하기 전에 일부 임시 저장소에서 열의 모든 값을 문자열로 연결해야합니다.
- Group_Concat의 최대 길이는 1024이며 그 후에는 다른 모든 것이 잘립니다.
(궁금한 경우, 값의 동의가 일관된 순서임을 확인할 수 있지만, group_concat ()를 믿지 않거나 group_concat () 안에있는 순서에 의해 주문을 받아들입니다. group_concat(some_column order by some_column)
)
MySQL은 내가이 문제에 유용 할 것으로 예상되는 비표준 비트 비트 어학적 함수 bit_and (), bit_or () 및 bit_xor ()를 제공합니다. 이 경우 열은 숫자이지만 문자열 열로 수행 할 수있는 방법이 있는지 알고 싶습니다.
이 특정 응용 프로그램의 경우 체크섬이 암호로 안전 할 필요는 없습니다.
해결책
당신이 잘 사용할 수있는 것 같습니다 crc32
대신에 md5
암호화 강도에 관심이 없다면. 나는 이것을 생각 해요:
select sum(crc32(some_column)) from some_table;
문자열에서 작동합니다. 아마도 mySQL이 임시 테이블을 만들 수 있기 때문에 비효율적 일 수 있습니다 (특히 추가 한 경우 order by
).
다른 팁
다음 쿼리는 Percona의 MySQL Table CheckSumming 도구에 사용됩니다. 이해하기가 조금 어렵지만 본질적으로 CRC32
s 모든 행에 대해 열 (또는 많은 열이 포함). XOR
그들 모두를 사용하여 함께 BIT_XOR
그룹 기능. 하나의 CRC 해시가 다른 경우 결과 XOR
모든 것이 다를 것입니다. 이것은 고정 메모리에서 발생하므로 자의적으로 큰 테이블을 확인할 수 있습니다.
SELECT CONV(BIT_XOR(CAST(CRC32(column) AS UNSIGNED)), 10, 16)
충돌 가능한 충돌을 막지는 않지만 명심해야 할 한 가지. CRC32
오늘날의 표준에 의한 꽤 약한 기능입니다. 더 좋은 해싱 함수는 The와 같은 것입니다 FNV_64
. 서로 보완하는 두 개의 해시가있을 가능성은 거의 없습니다. XOR
함께 에드.
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
열이 숫자 인 경우 다음을 수행 할 수 있습니다.
SELECT BIT_XOR(mycolumn) + SUM(mycolumn)
물론 이것은 패배하기 쉽지만 열에 모든 비트가 포함됩니다.