2011-12-16 5 views
5

निम्नलिखित कोड पर विचार करें। एक unordered_map में उपयोग करने के लिए कुंजी में सरणी के लिए एक अच्छा हैशिंग फ़ंक्शन क्या है?एक त्रि-राज्य द्वि-आयामी सरणी हैश कैसे है?

#include <unordered_map> 

using namespace std; 

enum TriState { 
    S0 = -1, 
    S1 = 0, 
    S2 = +1 
}; 

struct K { // Key for the map 
    TriState a[8][8]; 
    bool operator==(const K& k1) const { 
     for (int i = 0; i < 64; i++) 
      if (k1.a[0][i] != a[0][i]) 
       return false; 
     return true; 
    } 
}; 

struct Hash { 
    size_t operator()(const K& k) const { 
     size_t s; 
     // s = what is a good hash value? 
     return s; 
    } 
}; 

unordered_map<K, int, Hash> m; 
+1

आम तौर पर बोर्ड गेम में ज़ोब्रिस्ट-हैशिंग का उपयोग किया जाता है। – wildplasser

+0

ऑपरेटर == विधि पर मेरे अंदर ऑप्टिमाइज़र cringes। 64 int पढ़ता है जो संभवतः एक 16 बाइट बन सकता है जो थोड़ा सा झुकाव के साथ पढ़ता है। –

+0

@ माइकल डॉर्गन: अनुकूलन विफल। बस 'memcmp' का उपयोग करें और संकलक को इसे सरल बनाएं :)। – kennytm

उत्तर

3

इस एल्गोरिथ्म तेजी से हो सकता है और लगभग एक समान हैशिंग प्रदान करना चाहिए:

size_t s = 0x3a7eb429; // Just some random seed value 
for (int i = 0; i != 8; ++i) 
{ 
    for (int j = 0; j != 8; ++j) 
    { 
     s = (s >> 1) | (s << (sizeof(size_t) * 8 - 1)); 
     s ^= k.a[i][j] * 0xee6b2807; 
    } 
} 
s *= 0xee6b2807; 
s ^= s >> 16; 

उसके बाद, आप हैशिंग और मज़बूत बनाना चाहते हैं तो, हैश एक और समय उदाहरण MurmurHash3 के लिए इस्तेमाल करते हैं।

+0

http://ideone.com/rI9R2 मेरे लिए पर्याप्त पर्याप्त वितरण की तरह दिखता है। –

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