के लिए एक अच्छा हैश कोड (GetHashCode) उत्पन्न करना मुझे बिटटायर के लिए GetHashCode में एक तेज़ हैश कोड जेनरेट करने की आवश्यकता है। मेरे पास एक शब्दकोश है जहां चाबियाँ बिटराइज़ हैं, और सभी बिटरायर एक ही लंबाई के हैं।एक बिट हैरे
क्या किसी को इस परिदृश्य में बिट्स की एक चर संख्या से एक अच्छा हैश उत्पन्न करने के लिए एक तेज़ तरीका पता है?
अद्यतन:
दृष्टिकोण मैं मूल रूप से लिया (गति इस मामले में कैप्सूलीकरण से ज्यादा महत्वपूर्ण है) सीधे प्रतिबिंब के माध्यम से ints के आंतरिक सरणी तक पहुँचने के लिए है, तो उन मूल्यों XOR था। (
public int GetHashCode(BitArray array)
{
int hash = 0;
foreach (int value in array.GetInternalValues())
{
hash ^= value;
}
return hash;
}
हालांकि, दृष्टिकोण मार्क बायर्स ने सुझाव दिया और StackOverflow पर कहीं और देखा थोड़ा बेहतर था 16,570 बराबर है: XOR दृष्टिकोण यानी मेरे 'बराबर' अच्छी तरह से काम करने लगता है जब शब्दकोश में खोज विधि जरूरत से ज्यादा नहीं बुलाया जाता है मेरे परीक्षण डेटा के लिए एक्सओआर के लिए कॉल बनाम 16608)। ध्यान दें कि यह दृष्टिकोण पिछले एक बग को ठीक करता है जहां बिट सरणी के अंत से परे बिट्स हैश मान को प्रभावित कर सकता है। यह तब हो सकता है जब बिट सरणी लंबाई में कम हो गई हो।
public int GetHashCode(BitArray array)
{
UInt32 hash = 17;
int bitsRemaining = array.Length;
foreach (int value in array.GetInternalValues())
{
UInt32 cleanValue = (UInt32)value;
if (bitsRemaining < 32)
{
//clear any bits that are beyond the end of the array
int bitsToWipe = 32 - bitsRemaining;
cleanValue <<= bitsToWipe;
cleanValue >>= bitsToWipe;
}
hash = hash * 23 + cleanValue;
bitsRemaining -= 32;
}
return (int)hash;
}
GetInternalValues विस्तार विधि इस तरह कार्यान्वित किया जाता है:
public static class BitArrayExtensions
{
static FieldInfo _internalArrayGetter = GetInternalArrayGetter();
static FieldInfo GetInternalArrayGetter()
{
return typeof(BitArray).GetField("m_array", BindingFlags.NonPublic | BindingFlags.Instance);
}
static int[] GetInternalArray(BitArray array)
{
return (int[])_internalArrayGetter.GetValue(array);
}
public static IEnumerable<int> GetInternalValues(this BitArray array)
{
return GetInternalArray(array);
}
... more extension methods
}
सुधार के लिए कोई सुझाव का स्वागत है!
मैंने आपके दृष्टिकोण को कहीं और उल्लेख किया है, लेकिन मैं वास्तव में इसके पीछे सिद्धांत या 'जादू' प्राइम्स के चयन को समझ नहीं पा रहा हूं। यह दृष्टिकोण मूल रूप से लिया गया एक्सओआर दृष्टिकोण (16570 मेरे परीक्षण डेटा के लिए एक्सओआर के लिए 16608 के बराबर कॉल) की तुलना में थोड़ा अधिक प्रभावी था। अधिक जानकारी के लिए मेरा संपादन देखें। – bart