GetHashCode() problem using xor

前端 未结 2 1133
萌比男神i
萌比男神i 2021-02-14 07:08

My understanding is that you\'re typically supposed to use xor with GetHashCode() to produce an int to identify your data by its value (as opposed to by its reference). Here\'s

相关标签:
2条回答
  • 2021-02-14 07:44

    First off - Do not implement Equals() only in terms of GetHashCode() - hashcodes will sometimes collide even when objects are not equal.

    The contract for GetHashCode() includes the following:

    • different hashcodes means that objects are definitely not equal
    • same hashcodes means objects might be equal (but possibly might not)

    Andrew Hare suggested I incorporate his answer:

    I would recommend that you read this solution (by our very own Jon Skeet, by the way) for a "better" way to calculate a hashcode.

    No, the above is relatively slow and doesn't help a lot. Some people use XOR (eg a ^ b ^ c) but I prefer the kind of method shown in Josh Bloch's "Effective Java":

    public override int GetHashCode()
    {
        int hash = 23;
        hash = hash*37 + craneCounterweightID;
        hash = hash*37 + trailerID;
        hash = hash*37 + craneConfigurationTypeCode.GetHashCode();
        return hash;
    }
    

    The 23 and 37 are arbitrary numbers which are co-prime.

    The benefit of the above over the XOR method is that if you have a type which has two values which are frequently the same, XORing those values will always give the same result (0) whereas the above will differentiate between them unless you're very unlucky.

    As mentioned in the above snippet, you might also want to look at Joshua Bloch's book, Effective Java, which contains a nice treatment of the subject (the hashcode discussion applies to .NET as well).

    0 讨论(0)
  • 2021-02-14 08:02

    Andrew has posted a good example for generating a better hash code, but also bear in mind that you shouldn't use hash codes as an equality check, since they are not guaranteed to be unique.

    For a trivial example of why this is consider a double object. It has more possible values than an int so it is impossible to have a unique int for each double. Hashes are really just a first pass, used in situations like a dictionary when you need to find the key quickly, by first comparing hashes a large percentage of the possible keys can be ruled out and only the keys with matching hashes need to have the expense of a full equality check (or other collision resolution methods).

    0 讨论(0)
提交回复
热议问题