हालाँकि djb2, जैसा कि cnicutar द्वारा स्टैकओवरफ़्लो पर प्रस्तुत किया गया है , लगभग निश्चित रूप से बेहतर है, मुझे लगता है कि यह K & R हैश को दिखाने के लायक है:
1) K & R 1st संस्करण ( स्रोत ) में प्रस्तुत रूप में एक भयानक हैश एल्गोरिथम,
unsigned long hash(unsigned char *str)
{
unsigned int hash = 0;
int c;
while (c = *str++)
hash += c;
return hash;
}
2) संभवतः एक बहुत ही सभ्य हैश एल्गोरिथ्म, जैसा कि K & R संस्करण 2 में प्रस्तुत किया गया है (मेरे द्वारा पृष्ठ की 144 पृष्ठ पर सत्यापित); NB: % HASHSIZEयदि आप हैश एल्गोरिथ्म के बाहर मापांक आकार-से-आपकी-लंबाई करने की योजना पर वापसी विवरण से हटाना सुनिश्चित करते हैं। इसके अलावा, मैं आपको unsigned longसाधारण unsigned(इंट) के बजाय रिटर्न और "हैशवल" प्रकार बनाने की सलाह देता हूं ।
unsigned hash(char *s)
{
unsigned hashval;
for (hashval = 0; *s != '\0'; s++)
hashval = *s + 31*hashval;
return hashval % HASHSIZE;
}
ध्यान दें कि यह दो एल्गोरिदम से स्पष्ट है कि एक कारण 1 संस्करण हैश इतना भयानक है क्योंकि यह स्ट्रिंग स्ट्रिंग को ध्यान में नहीं रखता है क्रम , इसलिए hash("ab")इसलिए उसी मान को वापस करेगा hash("ba")। यह वह जगह है नहीं तो 2 संस्करण हैश के साथ, तथापि, जो होता है (ज्यादा बेहतर!) दो अलग-अलग मान उन स्ट्रिंग्स के लिए वापस जाएँ।
GCC C ++ 11 हैशिंग फ़ंक्शन unordered_map(हैश टेबल टेम्प्लेट) और unordered_set(हैश सेट टेम्प्लेट) के लिए उपयोग किए जाने वाले कार्य निम्नानुसार दिखाई देते हैं।
कोड:
// Implementation of Murmur hash for 32-bit size_t.
size_t _Hash_bytes(const void* ptr, size_t len, size_t seed)
{
const size_t m = 0x5bd1e995;
size_t hash = seed ^ len;
const char* buf = static_cast<const char*>(ptr);
// Mix 4 bytes at a time into the hash.
while (len >= 4)
{
size_t k = unaligned_load(buf);
k *= m;
k ^= k >> 24;
k *= m;
hash *= m;
hash ^= k;
buf += 4;
len -= 4;
}
// Handle the last few bytes of the input array.
switch (len)
{
case 3:
hash ^= static_cast<unsigned char>(buf[2]) << 16;
[[gnu::fallthrough]];
case 2:
hash ^= static_cast<unsigned char>(buf[1]) << 8;
[[gnu::fallthrough]];
case 1:
hash ^= static_cast<unsigned char>(buf[0]);
hash *= m;
};
// Do a few final mixes of the hash.
hash ^= hash >> 13;
hash *= m;
hash ^= hash >> 15;
return hash;
}