문제

골재로 열의 모든 값의 체크섬을 계산하고 싶습니다.

다시 말해, 나는 몇 가지를하고 싶습니다.

md5(group_concat(some_column))

이 접근법의 문제는 다음과 같습니다.

  1. 비효율적입니다. MD5 함수로 전달하기 전에 일부 임시 저장소에서 열의 모든 값을 문자열로 연결해야합니다.
  2. 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 도구에 사용됩니다. 이해하기가 조금 어렵지만 본질적으로 CRC32s 모든 행에 대해 열 (또는 많은 열이 포함). 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)

물론 이것은 패배하기 쉽지만 열에 모든 비트가 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top