2012-12-20 11 views
7

के कार्यान्वयन में मेरे पास कई मामलों हैं जहां मुझे डेटा के खिलाफ त्वरित तुलना/लुकअप करने के लिए GetHashCode ओवरराइड करने से सी # में एक सभ्य हैशिंग एल्गोरिदम तक पहुंच की आवश्यकता है।सी # एफएनवी हैश

मुझे एफएनवी हैश को वास्तव में आसान/अच्छा/त्वरित हैश एल्गोरिदम माना गया है। हालांकि, मैंने कभी सी # कार्यान्वयन का अच्छा उदाहरण नहीं देखा है।

FNV-1a हैश एल्गोरिथ्म के मुख्य प्रकार है:

hash = OFFSET_BASIS 
foreach (object value in object) 
{ 
    hash = hash^value.GetHashCode() 
    hash = hash * FNV_PRIME 
} 

तो, जब मैं एक वर्ग मैं अंत की तरह कुछ करने के लिए GetHashCode ओवरराइड:

public static class FNVConstants 
{ 
    public static readonly int OffsetBasis = unchecked((int)2166136261); 
    public static readonly int Prime = 16777619; 
} 

public override int GetHashCode() 
{ 
    int hash = Constants.FNVConstants.OffsetBasis; 
    hash = (hash^EntityId.GetHashCode()) * Constants.FNVConstants.Prime; 
    hash = (hash^FromDate.GetHashCode()) * Constants.FNVConstants.Prime; 
    hash = (hash^ToDate.GetHashCode()) * Constants.FNVConstants.Prime; 
    return hash; 
} 

लोग क्या करते हैं इस बारे में सोचो?

+2

यह मेरे लिए ठीक लग रहा है की तरह फोन ... आप shoudl बस पास 'हैश^कोष्ठक में x' - जैसे '(हैश^एक्स) * प्राइम '- अन्यथा गुणा पहले किया जाएगा। – digEmAll

उत्तर

7

आप अपने FNVConstants वर्ग को यह जोड़ सकता है

public static int CreateHash(params object[] objs) 
{ 
    return objs.Aggregate(OffsetBasis, (r, o) => (r^o.GetHashCode()) * Prime); 
} 

तो यह

public override int GetHashCode() 
{ 
    return FNVConstants.CreateHash(EntityId, FromDate, ToDate); 
} 
+0

अच्छा। मैंने कभी ऐसा कुछ नहीं करने के लिए लिंक का उपयोग करने का सोचा, लेकिन यह सही समझ में आता है। छोटा, संक्षिप्त। :) धन्यवाद – Keith

+4

GetHashCode को ढेर पर स्मृति आवंटित नहीं करना चाहिए। –

+0

हू? यह ढेर पर स्मृति आवंटित करता है? – Keith

संबंधित मुद्दे