2009-02-26 10 views
8

का एक कुल चेकसम बनाएं, मैं कुल मिलाकर कॉलम के सभी मानों का चेकसम गणना करना चाहता हूं।कॉलम

दूसरे शब्दों में, मैं

md5(group_concat(some_column)) 

के कुछ बराबर इस दृष्टिकोण के साथ समस्या क्या करना चाहते है:

  1. यह अक्षम है। इसे एमडी 5 फ़ंक्शन
  2. group_concat में अधिकतम लंबाई 1024 है, जिसके बाद कॉलम के सभी मानों को कॉलम के सभी मानों को एक अस्थायी संग्रहण में जोड़ना होगा, जिसके बाद बाकी सब कुछ छोटा हो जाएगा।

(यदि आप सोच रहे हैं, आप कर सकते हैं यह सुनिश्चित करें कि मूल्यों के concat एक सुसंगत क्रम में है, तथापि, के रूप में यह विश्वास है या नहीं group_concat() यह भीतर खंड द्वारा एक आदेश को स्वीकार करता है, जैसे group_concat(some_column order by some_column))

MySQL गैर-मानक बिटवाई कुल कार्यों BIT_AND(), BIT_OR() और BIT_XOR() प्रदान करता है जो मुझे लगता है कि इस समस्या के लिए उपयोगी होगा। कॉलम इस मामले में संख्यात्मक है लेकिन मुझे यह जानने में दिलचस्पी होगी कि स्ट्रिंग कॉलम के साथ ऐसा करने का कोई तरीका है या नहीं।

इस विशेष एप्लिकेशन के लिए, चेकसम को क्रिप्टोलॉजिकल रूप से सुरक्षित नहीं होना चाहिए।

उत्तर

2

ऐसा लगता है कि आप के रूप में अच्छी crc32 बजाय md5 उपयोग कर सकते हैं अगर आप क्रिप्टोग्राफिक ताकत के बारे में परवाह नहीं है। मुझे लगता है कि:

select sum(crc32(some_column)) from some_table; 

स्ट्रिंग पर काम करेगा। यह अक्षम हो सकता है क्योंकि शायद MySQL एक अस्थायी तालिका बनायेगा (विशेष रूप से यदि आपने order by जोड़ा)।

+0

'SUM()' यहां उपयोग करने के लिए सही बात नहीं है, क्योंकि दो अलग-अलग चेकसम एक ही मूल्य पर आसानी से योग कर सकते हैं –

+0

आप इस दृष्टिकोण के साथ संख्यात्मक अतिप्रवाह से कैसे बचते हैं? – Robert

1

तो स्तंभ में संख्यात्मक है, तो आप ऐसा कर सकते हैं:

SELECT BIT_XOR(mycolumn) + SUM(mycolumn) 

बेशक इस हराने के लिए आसान है, लेकिन यह स्तंभ में सभी बिट्स शामिल होंगे।

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 
4

निम्नलिखित क्वेरी पेर्कोन के माइस्क्ल टेबल चेकसमिंग टूल में उपयोग की जाती है। यह समझने में थोड़ा मुश्किल है, लेकिन अनिवार्य रूप से यह प्रत्येक पंक्ति के लिए CRC32 कॉलम (या स्तंभों का एक गुच्छा) है, तो XOR उन सभी को BIT_XOR समूह फ़ंक्शन का उपयोग करके एक साथ जोड़ता है। यदि एक सीआरसी हैश अलग है, तो XOR आईएनजी का परिणाम भी अलग होगा। यह निश्चित स्मृति में होता है, इसलिए आप मनमाने ढंग से बड़ी टेबल जांच सकते हैं।

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

एक बात ध्यान में रखना है कि हालांकि यह संभव विरोध पैदा नहीं करता, और CRC32 वर्तमान मानकों के अनुसार एक बहुत कमजोर कार्य है। एक अच्छा हैशिंग फ़ंक्शन FNV_64 जैसा कुछ होगा। 0Hएड के साथ एक दूसरे के पूरक होने पर दो हैंश होने की संभावना बहुत कम होगी।