मार्क और जॉन द्वारा बताए गए मूलभूत सिद्धांत हैं बुरा नहीं है लेकिन वे परिणामों के वितरण की उनकी समानता के मामले में इष्टतम से दूर हैं। अफसोस की बात है कि 'मुंह से गुणा' दृष्टिकोण नकल से इतने सारे लोगों द्वारा प्रतिलिपि बनाई गई है not the best choice in many cases बेहतर वितरण कार्यों की गणना करने के लिए सस्ता द्वारा हासिल किया जा सकता है (हालांकि यह बहुत आधुनिक हार्डवेयर पर मामूली है)। वास्तव में हैशिंग के कई पहलुओं में प्राइम फेंकना no panacea है।
यदि यह डेटा महत्वपूर्ण आकार के हैश तालिकाओं के लिए उपयोग किया जाता है तो मैं Bret Mulvey's excellent study and explanation of various modern (and not so modern) hashing techniques को आसानी से सी # के साथ पढ़ने की अनुशंसा करता हूं।
ध्यान दें कि विभिन्न हैश फ़ंक्शंस के तारों के साथ व्यवहार बहुत अधिक पक्षपातपूर्ण होता है, जिससे तार कम होते हैं (मोटे तौर पर बोलते हैं कि बिट्स प्रवाह से पहले कितने अक्षर हैं) या लंबे समय तक।
लागू करने के लिए सबसे सरल और आसान में से एक भी है, जेनकिन्स वन एक समय हैश में सबसे अच्छा है।
private static unsafe void Hash(byte* d, int len, ref uint h)
{
for (int i = 0; i < len; i++)
{
h += d[i];
h += (h << 10);
h ^= (h >> 6);
}
}
public unsafe static void Hash(ref uint h, string s)
{
fixed (char* c = s)
{
byte* b = (byte*)(void*)c;
Hash(b, s.Length * 2, ref h);
}
}
public unsafe static int Avalanche(uint h)
{
h += (h<< 3);
h ^= (h>> 11);
h += (h<< 15);
return *((int*)(void*)&h);
}
आप तो यह इतना की तरह उपयोग कर सकते हैं:
uint h = 0;
foreach(string item in collection)
{
Hash(ref h, item);
}
return Avalanche(h);
तुम इतनी जैसे कई अलग अलग प्रकार के विलय कर सकते हैं:
public unsafe static void Hash(ref uint h, int data)
{
byte* d = (byte*)(void*)&data;
AddToHash(d, sizeof(int), ref h);
}
public unsafe static void Hash(ref uint h, long data)
{
byte* d= (byte*)(void*)&data;
Hash(d, sizeof(long), ref h);
}
आप केवल के साथ एक वस्तु के रूप में क्षेत्र में पहुंच सकते हैं आंतरिकों का कोई ज्ञान नहीं, आप बस प्रत्येक पर GetHashCode() को कॉल कर सकते हैं और उस मान को गठबंधन कर सकते हैं:
uint h = 0;
foreach(var item in collection)
{
Hash(ref h, item.GetHashCode());
}
return Avalanche(h);
अफसोस की बात है कि आप आकार (टी) नहीं कर सकते हैं, इसलिए आपको प्रत्येक संरचना को व्यक्तिगत रूप से करना होगा।
यदि आप प्रतिबिंब का उपयोग करना चाहते हैं तो आप प्रति प्रकार के आधार पर एक फ़ंक्शन बना सकते हैं जो संरचनात्मक पहचान और सभी क्षेत्रों पर हैशिंग करता है।
यदि आप असुरक्षित कोड से बचना चाहते हैं तो आप बिट्स मास्किंग तकनीकों का उपयोग इनट्स (और तारों से निपटने के दौरान तारों) से अलग बिट्स को खींचने के लिए कर सकते हैं ताकि बहुत अधिक परेशानी न हो।
यह आपके अपडेट से लगता है कि आप इस प्रक्रिया से आउटपुट की उम्मीद कर रहे हैं ताकि टक्कर की पर्याप्त कम संभावना हो सके ताकि इसे एक अद्वितीय कुंजी के रूप में पेश किया जा सके ... आपको _very_ good हैश और कुछ और बिट्स की आवश्यकता है इस काम को बनाने के लिए 32 से अधिक – ShuggyCoUk
यदि आप एक कुंजी चाहते हैं तो क्रिप्टो हैश का उपयोग करना सामान्य रूप से पर्याप्त होगा (जब तक आपको इसकी क्रिप्टो गुणों की परवाह नहीं है MD5 ठीक है) लेकिन यह अन्य की तुलना में गणना करने के लिए काफी महंगा होगा जैसे प्रभावी गैर क्रिप्टो हैश होंगे। – ShuggyCoUk