2011-10-14 14 views
7

SQL सर्वर के हैशिंग फ़ंक्शन HASHBYTES में 8000 बाइट्स की इनपुट सीमा है, जिसमें 8000 बाइट्स से अधिक हैशिंग है।SQL सर्वर

आप कैसे बड़े स्ट्रिंग हैंश?

उत्तर

5

आप इनपुट के 8k (या 4k या 2k) हिस्सों को हैश कर सकते हैं और फिर या तो उन हैंश को जोड़ सकते हैं या उन्हें एक नए हैश मान में जोड़ सकते हैं। यह मुश्किल हो सकता है हालांकि यदि आपको SQL सर्वर के बाहर बनाए गए हैंश की तुलना करने के लिए एक समान एल्गोरिदम (उदाहरण के लिए बाहरी .NET ऐप में) बनाना है।

एक और विकल्प: SQL सर्वर के CLR integration पर दुबला और .NET असेंबली में हैशिंग निष्पादित करें।

+1

धन्यवाद पॉल, यह आंतरिक उपयोग के लिए वास्तव में एक अच्छा समाधान है। लेकिन इस मामले में इसे sha1 – SDReyes

+1

@SDReyes के साथ पूरी तरह से अनुपालन करना होगा: मेरे उत्तर में एक और विचार जोड़ा गया: SQL सर्वर के सीएलआर एकीकरण पर दुबला और .NET असेंबली में हैशिंग प्रदर्शन करें। –

2

पॉल के विचार की तरह, एक विचार जो चंकिंग के लिए दिमाग में आता है, एक एक्सएमएल कॉलम में हैश स्ट्रिंग को स्टोर करना होगा, प्रत्येक खंड को एक अलग एक्सएमएल तत्व के रूप में स्टोर करना होगा।

+0

+1 अच्छा विचार, हालांकि डेटा अखंडता के लिए मैं सुझाव दूंगा कि एक हैश मान संग्रहीत किया जाए (हैश का हैश।) एक एक्सएमएल संरचना के साथ आपको एक अतिरिक्त विशेषता की आवश्यकता होगी जो एनएचएच के सूचकांक के लिए हैश मान को मानचित्रित करे डेटा धोया गया था। –

9

आप एक SQL CLR समारोह लिख सकते हैं:

[Microsoft.SqlServer.Server.SqlFunction] 
public static SqlBinary BigHashBytes(SqlString algorithm, SqlString data) 
{ 
    var algo = HashAlgorithm.Create(algorithm.Value); 

    var bytes = Encoding.UTF8.GetBytes(data.Value); 

    return new SqlBinary(algo.ComputeHash(bytes)); 
} 

और फिर यह इस तरह एसक्यूएल में कहा जा सकता है:

--these return the same value 
select HASHBYTES('md5', 'test stuff') 
select dbo.BigHashBytes('md5', 'test stuff') 

BigHashBytes केवल तब आवश्यक है लंबाई 8k से अधिक होगी।

+7

सीएलआर एसपी पैरामीटर के साथ सावधानीपूर्वक 8000 बाइट्स को छोटा कर दिया गया - मुझे पैरामीटर को '[एसक्लफैसेट (मैक्ससाइज = -1)] के साथ टैग करना था, अन्यथा 8000th के बाद बाइट को अनदेखा कर दिया जाएगा! मुझे वह पाने के लिए थोड़ी देर लग गई! – randomdude

+0

-1 यूटीएफ -8 का उपयोग करने में भ्रामक पाठकों (अनजाने में, ज़ाहिर है) के लिए। एसक्यूएल सर्वर (और सामान्य रूप से विंडोज़) यूटीएफ -16 का उपयोग करता है। इसलिए यह कई लोगों के लिए काम करेगा जो वर्तमान में केवल कोड पॉइंट्स 0 - 127, या संभवतः 256 तक उपयोग कर रहे हैं। लेकिन यूटीएफ -8 का उपयोग करने से इस प्रश्न जैसी समस्याएं आती हैं: [.NET ComputeHash पर आधारित SQL CLR फ़ंक्शन नहीं है साइरिलिक के साथ काम करना] (http://stackoverflow.com/a/35273859/577765) –

+0

@randomdude आपका अनुभव एसएसडीटी के पुराने संस्करणों ने टी-एसक्यूएल रैपर ऑब्जेक्ट्स उत्पन्न किए थे। 'SqlChring' के लिए' NVARCHAR (4000) 'और' SVlChars' के लिए 'NVARCHAR (MAX)' का उपयोग करने के लिए डिफ़ॉल्ट का उपयोग किया जाता था। लेकिन विजुअल स्टूडियो 2013 के समय के बाद से, डिफ़ॉल्ट दोनों को 'NVARCHAR (MAX)' का उपयोग करने के लिए बदल दिया गया था। फिर भी, जब आप उल्लेख करते हैं तो स्पष्ट होना और '[SqlFacet()]' का उपयोग करना हमेशा बेहतर होता है, लेकिन नए एसएसडीटी संस्करणों का उपयोग करने वाले लोग उसमें नहीं भागेंगे। इसके अलावा, एसक्यूएलसीएलआर केवल 'NVARCHAR' का समर्थन करता है, इसलिए यह वास्तव में 4000 वर्णों पर छोटा हो जाएगा :-)। –