যদিও djb2
, যেমন cnicutar দ্বারা Stackoverflow উপস্থাপিত , ভাল প্রায় অবশ্যই, আমি এটা দেখাচ্ছে মূল্য মনে কে & R এর খুব হ্যাশ:
1) কেএন্ডআর প্রথম সংস্করণে উত্স হিসাবে উপস্থাপিতভাবে দৃশ্যত একটি ভয়াবহ হ্যাশ অ্যালগরিদম ( উত্স )
unsigned long hash(unsigned char *str)
{
unsigned int hash = 0;
int c;
while (c = *str++)
hash += c;
return hash;
}
2) সম্ভবত একটি চমত্কার শালীন হ্যাশ অ্যালগরিদম, কে ও আর সংস্করণ 2 এ উপস্থাপন করা হয়েছে (বইয়ের পৃষ্ঠা 144-তে আমার দ্বারা যাচাই করা হয়েছে); এনবি: % 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")
। এটি ২ য় সংস্করণের হ্যাশের সাথে তেমন নয় , তবে, যা এই স্ট্রিংগুলির জন্য দুটি পৃথক মান প্রদান করবে।
unordered_map
(একটি হ্যাশ টেবিল টেমপ্লেট) এবং unordered_set
(একটি হ্যাশ সেট টেম্পলেট) এর জন্য ব্যবহৃত জিসিসি সি ++ 11 হ্যাশিং ফাংশনগুলি নীচে প্রদর্শিত হবে।
কোড:
// 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;
}