2011-11-05 13 views
5

मेरे पास दो एरे हैं: char data1 [length] जहां लंबाई 8 का एक से अधिक है यानी लंबाई 8, 16,24 हो सकती है ... सरणी में फ़ाइल से बाइनरी डेटा पढ़ा जाता है यह बाइनरी मोड में खुला है। मैं फ़ाइल से पढ़ना जारी रखूंगा और हर बार जब मैं पढ़ूं तो मैं एक हैश टेबल में पढ़ा गया मान संग्रहीत करूंगा। इस बाइनरी डेटा के विघटन में एक यादृच्छिक वितरण है। मैं प्रत्येक सरणी को हैश करना चाहता हूं और उन्हें विशिष्ट डेटा के साथ चार को देखने में सक्षम होने के लिए एक हैश तालिका में स्टोर करना चाहता हूं। इस कार्य को प्राप्त करने के लिए एक अच्छा हैशिंग फ़ंक्शन क्या होगा। धन्यवादहैश यादृच्छिक बाइनरी तारों के लिए उचित हैशिंग फ़ंक्शन

कृपया ध्यान दें कि मैं इसे सी ++ और सी में लिख रहा हूं, इसलिए कोई भी भाषा जिसे आप समाधान प्रदान करने के लिए चुनते हैं वह बहुत अच्छा होगा।

+0

आप * बर्कले डीबी 4 * क्यों नहीं लेते हैं और उस लाइब्रेरी को सभी विवरणों को संभालने दें? –

+0

और हैश टकराव के बारे में आप क्या करेंगे? –

उत्तर

3

डेटा है कि आप पढ़ सकते हैं 8 बाइट्स लंबे और वास्तव में बेतरतीब ढंग से वितरित है, और अपने hashCode 32 बिट, क्या इस बारे में होने की जरूरत है, तो:

uint32_t hashcode(const unsigned char *data) { 
    uint32_t hash = 0; 
    hash ^= get_uint32_le(data + 0); 
    hash ^= get_uint32_le(data + 4); 
    return hash; 
} 

uint32_t get_uint32_le(const unsigned char *data) { 
    uint32_t value = 0; 
    value |= data[0] << 0; 
    value |= data[1] << 8; 
    value |= data[2] << 16; 
    value |= data[3] << 24; 
    return value; 
} 

आप और अधिक गति की जरूरत है, इस कोड को शायद बनाया जा सकता है बहुत तेज़ यदि आप गारंटी दे सकते हैं कि data हमेशा const uint32_t * के रूप में व्याख्या करने के लिए ठीक से गठबंधन किया गया है।

+0

जैसा कि प्रश्न में उल्लिखित है, लंबाई एक संख्या है जो 8 का एक बहु है। मैं अपने विचारों को 8s के बहुमत के लिए कैसे बढ़ा सकता हूं न केवल 8 बाइट्स? –

+0

हैशकोड फ़ंक्शन में 'size_t datalen' पैरामीटर जोड़कर। जब आप कोड को समझ चुके हैं, तो यह करने के लिए एक छोटी सी चीज है। मैंने कोड भी लिखा ताकि इसे आसानी से बढ़ाया जा सके। –

+2

+1: हालांकि यदि डेटा वास्तव में यादृच्छिक है (मुझे लगता है कि हम वास्तव में यहां "वर्दी" का मतलब है), आपको xor की भी आवश्यकता नहीं है; बस अपने हैश के रूप में पहले 32 बिट्स का उपयोग करें। –

2

मैंने अपनी परियोजनाओं में से एक में सफलतापूर्वक MurmurHash3 का उपयोग किया है।

सकारात्मक:

  • यह तेजी है। बहुत तेज़
  • माना जाता है कि यह कम टक्कर दर है।

विपक्ष:

  • यह क्रिप्टोग्राफी अनुप्रयोगों के लिए उपयुक्त नहीं है।
  • यह किसी भी आकार या रूप में मानकीकृत नहीं है।
  • यह गैर-x86 प्लेटफ़ॉर्म पर पोर्टेबल नहीं है। हालांकि, यह इतना छोटा है कि आपको इसे पोर्ट करने में सक्षम होना चाहिए यदि आपको वास्तव में आवश्यकता है - मैं इसे जावा पर पोर्ट करने में सक्षम था, हालांकि यह लगभग एक ही चीज़ नहीं है।

उदाहरण के लिए यह एक अच्छी संभावना है। एक तेज़ हैश-टेबल कार्यान्वयन ...

+0

मैं भी अपनी परियोजना पर लागू करना चाहता हूं, असल में मैं मुरमुराश के माध्यम से बाइनरी में हैश स्ट्रिंग करना चाहता हूं। लेकिन मुर्मूर हैश एल्गोरिदम भी नकारात्मक हैश मान उत्पन्न करता है। तो मुझे समस्या का सामना करना पड़ रहा है। जैसा कि आपने ऊपर उल्लेख किया है, मैं उसी कोड को लागू करता हूं। यह आपके पास हैशिंग एल्गोरिदम है जिसमें समान संदेश के लिए समान हैश मान देता है। उदाहरण के लिए यदि एक चरित्र में केवल परिवर्तन है तो हैश मान में कम परिवर्तन। –

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