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



Answers

सबसे पहले, GetHashCode() का उपयोग करने पर विचार करें।

आपके मौजूदा कार्यान्वयन पर एक सरल सुधार:

static UInt64 CalculateHash(string read, bool lowTolerance)
{
    UInt64 hashedValue = 0;
    int i = 0;
    ulong multiplier = 1;
    while (i < read.Length)
    {
        hashedValue += read[i] * multiplier;
        multiplier *= 37;
        if (lowTolerance) i += 2;
        else i++;
    }
    return hashedValue;
}

यह महंगा फ्लोटिंग पॉइंट गणना, और ElementAt के ओवरहेड से ElementAt

(UInt64)Math.Pow(31, i) लंबे तारों के लिए अच्छी तरह से काम नहीं करता है। फ़्लोटिंग पॉइंट राउंडिंग 15 या उससे अधिक वर्णों के लिए 0 के गुणक की ओर ले जाएगा।

Question

मैं 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;
}



मैंने पॉल हसीह के कार्यान्वयन के साथ खेला है, और थोड़ा टकराव के साथ तेज़ प्रतीत होता है (वैसे भी मेरे परिदृश्यों के लिए)






Related