c# - सी # में स्ट्रिंग के लिए एक तेज़ हैश फ़ंक्शन




2 Answers

static UInt64 CalculateHash(string read)
{
    UInt64 hashedValue = 3074457345618258791ul;
    for(int i=0; i<read.Length; i++)
    {
        hashedValue += read[i];
        hashedValue *= 3074457345618258799ul;
    }
    return hashedValue;
}

यह एक नुथ हैश है। आप Jenkins भी उपयोग कर सकते हैं।

मैं 30 से ऊपर की लंबाई की एक स्ट्रिंग चाहता हूं। अगर यह मेरी चिंता है तो ऐसा करने का सबसे अच्छा विचार क्या होगा। समारोह 100 मिलियन से अधिक बार बुलाया जाएगा। वर्तमान में मैं निम्नलिखित कोड का उपयोग कर रहा हूँ,

static UInt64 CalculateHash(string read, bool lowTolerance)
{
    UInt64 hashedValue = 0;
    int i = 0;
    while (i < read.Length)
    {
        hashedValue += read.ElementAt(i) * (UInt64)Math.Pow(31, i);
        if (lowTolerance) i += 2;
        else i++;
    }
    return hashedValue;
}



अपने कार्यान्वयन को तेज करने के लिए, (UInt64)Math.Pow(31, i) कॉल को लुकअप द्वारा प्रतिस्थापित किया जाना चाहिए: 31 की पहली 30 शक्तियों की एक तालिका की पूर्व-गणना करें, और इसे रनटाइम पर उपयोग करें। चूंकि लंबाई की सीमा 30 है, आपको केवल 31 तत्व की आवश्यकता है:

private static unsigned long[] Pow31 = new unsigned long[31];

static HashCalc() {
    Pow31[0] = 1;
    for (int i = 1 ; i != Pow31.Length ; i++) {
        Pow31[i] = 31*Pow31[i-1];
    }
}

// In your hash function...
hashedValue += read.ElementAt(i) * Pow31[i];



Related

c# string performance hash