2011-08-22 12 views
11

मुझे unordered_map के लिए हैश फ़ंक्शन का विशेषज्ञ होना चाहिए ताकि मैं int arrays को चाबियों के रूप में उपयोग कर सकूं। सरणी मान आमतौर पर 0 या 1 होते हैं, उदा। int array = {0, 1, 0, 1}, लेकिन तकनीकी रूप से बाध्य नहीं है।सी ++ हैश फ़ंक्शन एक int सरणी

क्या कोई इस मामले में एक अच्छा हैश फ़ंक्शन सुझा सकता है? वैकल्पिक रूप से, मैं हमेशा int सरणी को एक स्ट्रिंग में परिवर्तित कर सकता हूं और विशेषज्ञता से बच सकता हूं। लेकिन मैं प्रदर्शन के बारे में चिंतित हूं क्योंकि मेरे पास इनमें से कई लाख सरणी हो सकती हैं।

+2

बूस्ट की "श्रेणी हैश" का उपयोग या नकल करें। यह बार-बार 'हैश_कॉमबाइन' को कॉल करके बनाया गया है, जो बूस्ट में भी है और वास्तव में मानक में होना चाहिए। –

+0

यदि आपके पास उन लाखों एरे हैं, तो मैं नए एल्गोरिदम/डेटा संरचनाओं का सुझाव देता हूं ... – Blindy

+0

@ ब्लिंडी आप किस डेटा संरचना का सुझाव देंगे? – gewizz

उत्तर

6

सी ++ टीआर 1 में हैश टेम्पलेट फ़ंक्शन है।

यदि आपके पास अभी तक नहीं है, तो आप बूस्ट हैश का उपयोग कर सकते हैं। एक आसान सहायक के लिए

विचार:

#include <boost/functional/hash.hpp> 

template <typename T, int N> 
    static std::size_t hasharray(const T (&arr)[N]) 
{ 
    return boost::hash_range(arr, arr+N); 
} 

यह (? मोटे तौर पर) होगा

size_t seed = 0; 
for (const T* it=arr; it!=(arr+N); ++it) 
    boost::hash_combine(seed, *it); 
return seed; 

के बराबर उचित समानता तुलना आपरेशन आप इस उपयोग कर रहे हैं को लागू करने के लिए मत भूलना लुकअप के लिए हैश

+0

मुझे लगता है कि यह 'std :: size_t N' होना चाहिए क्योंकि' std :: size_t' को सबसे बड़ी संभव सरणी के आकार का प्रतिनिधित्व करने में सक्षम होने की गारंटी है, जबकि 'int' ओवरफ़्लो (सिस्टम के आधार पर) हो सकता है। इसके अलावा, इसे एक हस्ताक्षरित प्रकार होने की आवश्यकता नहीं है। – outofthecave

+0

@outofthecave मेले अंक। हालांकि, हस्ताक्षरित संक्रामक है और यह ऑफसेट के लिए इसे कमजोर बनाता है (वे नकारात्मक हो सकते हैं, और 'एन -10' बस 'एन <10' आश्चर्यचकित हो जाएगा)। इसके अलावा, सरणी 2³¹ तत्वों से बड़े पैमाने पर टाइप की गई है? वे दुर्लभ हैं। और यदि आप उन्हें थे, तो आप अक्सर उन्हें परेशान नहीं करेंगे। – sehe

5

lookup8 हैश फ़ंक्शन का उपयोग करने का प्रयास करें। यह कार्य बहुत तेज़ और अच्छा है।

int key[100]; 
int key_size=10; 
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data 
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0); 
+0

यह सी ++ नहीं है। – Puppy

+9

आमतौर पर हैश फ़ंक्शन सादे सी में लिखे जाते हैं। आप इसके लिए सी ++ रैपर बना सकते हैं। – vromanov

+2

आमतौर पर, हैश फ़ंक्शन * भाषा में * लिखे गए हैं। – Puppy

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