2009-10-28 5 views
10

मैं एक साधारण सामग्री प्रबंधन प्रणाली लिख रहा हूं। मुझे SHA1 हैश मानों को स्टोर करने की आवश्यकता है जिन्हें मेरी सबसे बड़ी तालिका के लिए प्राथमिक कुंजी के रूप में बाहरी रूप से गणना की जाती है।पोस्टग्रेज़ में प्राथमिक कुंजी के रूप में SHA1 हस्ताक्षर संग्रहीत करना SQL

मैं स्पष्ट रूप से प्राथमिक कुंजी के रूप में अनुक्रम का उपयोग कर सकता हूं और SHA1 हेक्स-स्ट्रिंग को देखने के लिए इंडेक्स कर सकता हूं ... हालांकि, मैं एक और अधिक सुरुचिपूर्ण समाधान ढूंढ रहा हूं, जहां मैं केवल 20-बाइट का उपयोग करूंगा SHA1 ने पंक्तियों को दी गई कुंजी के रूप में मानों की गणना की है जो मैं डेटाबेस तालिका में डालने/हटाने/अपडेट करने जा रहा हूं। क्या कोई कुशल स्टोरेज प्रकार है जिसका उपयोग मैं स्टोर करने के लिए और बाद में SHA1 कुंजी को प्राथमिक कुंजी के रूप में उपयोग करने के लिए कर सकता हूं?

मैं postgres इस करवाने के लिए कुंजी के रूप में 20-बाइट मूल्यों का उपयोग कर समर्थन करने के लिए स्पष्ट रूप से की आवश्यकता होगी।

कोई भी विचार किसी के साथ?

+4

बीटीडब्ल्यू, बस ध्यान रखें कि सभी हैश कुंजी टकरा सकती हैं, यहां तक ​​कि SHA1 भी। –

+0

मैं हैश टकराव के बारे में SHA1 का एक उचित कार्यान्वयन के साथ चिंता नहीं :) देखें http://stackoverflow.com/questions/297960/hash-collision-what-are-the-chances – wojo

उत्तर

1

इससे सावधान रहें कि यह आपके सूचकांक btrees के साथ क्या कर सकता है। चूंकि एसएचए 1 अनुक्रमिक नहीं होगा, इसलिए बीटी में चारों ओर कूदने के कारण आपके लेखन बहुत धीमे होंगे।

एक दृश्य काम नहीं करेगा, तो मैं आमतौर पर एक अनुक्रमिक GUID/UUID सिफारिश करेंगे किसी प्रकार की (उदाहरण के लिए एसक्यूएल सर्वर के NEWSEQUENTIALID() देखें)।

आप SHA1 अपने प्राथमिक कुंजी यह जानने के बाद, आप इसे एक मानक हेक्स प्रारूप कि SHA1 आमतौर पर में दिखाया गया है करने के लिए परिवर्तित कर सकते हैं बनाना चाहते हैं (यह आसान टाइप करने के लिए करता है)। मैं एक बाइनरी प्रारूप की अनुशंसा नहीं करता क्योंकि आप इसे डिबगिंग आदि के लिए टाइप नहीं कर पाएंगे।

+7

एक 'बी Tree' लिए लिखता है वैसे भी अनुक्रमिक होगा, यह पेज के लिए लिंक करने के लिए खोज है जो चारों ओर कूद जाएगा। हालांकि, मूल्यों का वितरण पेड़ को और अधिक संतुलित बनाएगा और खोज तेजी से धीमा नहीं होगा। – Quassnoi

+1

मुझे लगता है कि मैं कुछ डेटाबेस सर्वर क्लस्टर इंडेक्स के अनुसार पृष्ठों को ऑर्डर करने का तरीका बता रहा था, लेकिन यह SQL सर्वर है, मुझे नहीं पता कि यह pgsql पर लागू होता है या नहीं। हम्म! लेकिन आप सही हैं, पेड़ बहुत अच्छी तरह से संतुलित होगा (लगभग पूरी तरह से) – wojo

+0

'@ wojo': यहां तक ​​कि क्लस्टर्ड टेबल के साथ, 'SQL सर्वर'' बी-ट्री 'ऑर्डर रखता है, भौतिक क्रम नहीं। पंक्तियों को भौतिक रूप से, केवल तार्किक रूप से आदेश नहीं दिया जाता है। http://msdn.microsoft.com/en-us/library/ms177443(SQL.90).aspx – Quassnoi

2

आप या तो हेक्स या बेस 64 में परिवर्तित कर सकते हैं और varchar कॉलम का उपयोग कर सकते हैं या इसे bytea -typed कॉलम में संग्रहीत करने का प्रयास करें। मैं दोनों प्रारूपों में यादृच्छिक मूल्यों के समूह के साथ टेबल बनाने की कोशिश करता हूं और देखता हूं कि वे कैसे प्रदर्शन करते हैं।

उस प्रकार पर जानकारी के लिए the PostgreSQL docs on bytea देखें।

5

विशेष रूप से यदि आप डीबी में बाइनरी पैरामीटर करेंगे (उदाहरण के लिए libpq के माध्यम से), बाइटिया का उपयोग करें। यदि आप सरल पाठ प्रश्नों के माध्यम से बहुत सारे हेरफेर करना चाहते हैं, तो टेक्स्ट या वर्कर कॉलम में हेक्स्ट और स्टोर में कनवर्ट करें।

PostgreSQL निश्चित रूप से 20 बाइट चाबियाँ, की तुलना में है कि प्रदर्शन भूमि के ऊपर के पाठ्यक्रम एक दृश्य के साथ तुलना में अधिक है दूसरे के साथ सामान्य रूप में कोई समस्या नहीं होगी।

संबंधित मुद्दे