हालाँकि 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;
}