2014-05-24 17 views
6

मुझे समझ में नहीं आता क्यों Data.HashTableData.Hashable का उपयोग कर रहा है, जिसमें hashWithSalt (केवल/मूल) विधि के रूप में है।डेटा क्यों है। हैशटेबल नमक के साथ हैशिंग का उपयोग करता है (डेटा से। हैशबल)?

यह एक बार हैश मान की गणना करने के प्राकृतिक अनुकूलन के साथ फिट नहीं है, और इसे ऑब्जेक्ट (प्राकृतिक, क्योंकि हास्केल ऑब्जेक्ट्स अपरिवर्तनीय हैं) में संग्रहीत करता है।

यदि मैं HashTables का उपयोग करना चाहता हूं, तो मुझे hashWithSalt लागू करने के लिए मजबूर होना पड़ता है। (1.2.0 जा रहे हैं। * 1.2.1 करने के लिए। *, Hashable फिर से शुरू की एक वर्ग पद्धति के रूप में hash, लेकिन यह मदद नहीं करता है?)

वास्तविक तालिका कार्यान्वयन hashWithSalt का उपयोग करना (नहीं है HashTable.ST.Linear बिलकुल नहीं है, HashTable.ST.Cuckoo केवल दो निश्चित लवण का उपयोग करता है)।

+0

आप किस पैकेज को देख रहे हैं? http://hackage.haskell.org/package/base-4.5.1.0/docs/Data-HashTable.html बिल्कुल 'हैशबल' का उपयोग नहीं करता है। – dfeuer

+0

क्या आप हैश के संदर्भ में 'हैशविथसाल्ट' लागू नहीं कर सकते? कोयल संस्करण काम नहीं कर सकता है लेकिन अन्य हैशटेबल्स होगा। –

+1

कारण हैश टेबल एक हैश का उपयोग नमक के साथ हैश टक्कर को कम करने के लिए है जब हमलावर मेज में डाली गई कुंजियों को नियंत्रित कर सकता है। बेशक, उन्हें लाइब्रेरी द्वारा निर्धारित लवण के बजाय साइट-विशिष्ट लवण का उपयोग करना चाहिए .. – Carl

उत्तर

2

जैसा कि कार्ल टिप्पणियों में नोट करता है, पर hash (मूल Hashable उपयोग के रूप में) पर जाने के लिए लोगों को हैश टकराव के आधार पर डीओएस हमलों को कम करने की अनुमति देना था। एक अवधि के लिए, पृष्ठभूमि में unsafePerformIO का उपयोग करके, प्रत्येक रन पर एक अलग यादृच्छिक डिफ़ॉल्ट नमक उत्पन्न किया गया था। पुनरुत्पादन की यह कमी एक बड़ी समस्या साबित हुई, हालांकि, रुचि रखने वाले लोगों के लिए रनों में लगातार डेटा संरचनाएं, भरोसेमंद बेंचमार्किंग नंबर आदि प्राप्त करना,

तो, वर्तमान दृष्टिकोण विधि प्रदान करना है, लेकिन तय किए गए डिफ़ॉल्ट नमक को स्थगित करना है, और फिर दस्तावेज़ में चेतावनी जोड़ें सार्वजनिक रूप से सामना करने वाले तरीकों से उपयोग किए जाने पर विभिन्न संभावित डॉस हमले वैक्टरों के लिए अतिसंवेदनशील रहता है। (आप यहाँ दस्तावेज में खुद के लिए देख सकते हैं: http://hackage.haskell.org/package/hashable-1.2.1.0/docs/Data-Hashable.html)

क्योंकि hash अपने ही वर्ग विधि है, यह काफी आसान एक "saltless" हैश है कि यह साथ memoed है के साथ एक वस्तु को लागू करने की है, और इसके अलावा, आप कर सकते हैं यदि आप चाहें तो नमक के साथ xor आईएनजी के रूप में hashWithSalt लागू करें। या, टिप्पणियों के नोट के रूप में, आप अपने उत्पन्न/ज्ञात hash में hash की एक और वैध विधि के माध्यम से hashWithSalt लागू कर सकते हैं।

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