方法を実装するGetHashCode構造物の二つの文字列は、文字列の互換性があります

StackOverflow https://stackoverflow.com/questions/70303

  •  09-06-2019
  •  | 
  •  

質問

い構造のクライアントまで、フルのC#:

public struct UserInfo
{
   public string str1
   {
     get;
     set;
   }

   public string str2
   {
     get;
     set;
   }   
}

みください UserInfo(str1="AA", str2="BB").Equals(UserInfo(str1="BB", str2="AA"))

どのようにオーバーライドのGetHashCode機能のためこの構造ですか?

役に立ちましたか?

解決

MSDN:

ハッシュ関数の性質:

  • 場合には、二つのオブジェクトと比較して同等の GetHashCode のためのオブジェクトを返す必要があと、同じ値を表示します。しかし、場合には、二つのオブジェクトと比べないのと同じ GetHashCode 方法の二つのオブジェクトになるの値が異なります。
  • GetHashCode 法オブジェクトは一貫して返し同じハッシュコードなどが変更オブジェクトの状態の返却値の型に"byte[]"を指定のオブジェクトの Equals 方法。これは真の現在のアプリケーションを実行し、異なるハッシュコードを返すこともできますがされた場合、アプリケーションです。
  • 最高性能のハッシュ機能を生み出さなければならなランダムな分布をすべて入力します。

で考慮正しい方は:

return str1.GetHashCode() ^ str2.GetHashCode() 

^ 置き換えることもできますその他の可換操作

他のヒント

Jon Skeetの回答 -バイナリー事業など ^ ななされることが、しばしばあるとの衝突のハッシュ!

public override int GetHashCode()
{
    unchecked
    {
        return (str1 ?? String.Empty).GetHashCode() +
            (str2 ?? String.Empty).GetHashCode();
    }
}

の'+'オペレーターの方が良いかもしれないよ'^'では明示的にしたい('AA',BB)および('BB','AA')を明示的に同一でもない場合がありたい('AA','AA')および('BB,BBすることによって、これらの同一の(またはすべて等しいペアがい).

にこのときの"ルールが完全に接着したこのソリューションにおいてが入手できなかった場合はnullこの実行'GetHashCode()の空の文字列ではなく直ちに返知られる定数がなくても明示的に測定していきたいと思い危険かを当てるというものに違いないのに十分な大きさでは心配ない限り、期待くださいnull.

  1. 原則として、簡単に生成するハッシュコードのためのクラスはXORすべてのデータ分野に参加できる生成のハッシュコード(ご注意チェックとしてnullが指摘された。このもの(人工?) 必要条件ュー内のためUserInfo(ド"AA","BB")UserInfo("BB","AA")が同じものを一致させます。

  2. だけではもったいない前提をご利用についてのクラスは、ることができるでしょう改善のハッシュ機能です。例えばれるのが一般的であstr1とstr2同じXORにはならない場合があります。だstr1とstr2は、氏名、XORいます。

ことはないことが明らかであることを挙げることは指摘するとともに:-この貧しい使用例のstruct:Structるすべての値が意味をなさる場合はこちらです。-使用性とセッターを生成するハッシュコードもいます。

簡単な 一般 方法はこ

return string.Format("{0}/{1}", str1, str2).GetHashCode();

場合を除き厳しい性能要求をして私が考えられることはいいの頻度でこのメソッドを使って複合鍵があります。取り扱いに null 場合には、イブレア城、イブレアとの起こらない(m)任意のハッシュの衝突(一般).が予想される場合は'/'に文字列だけを選別の区切りのままでいること。

public override int GetHashCode()   
{       
    unchecked      
    {           
        return(str1 != null ? str1.GetHashCode() : 0) ^ (str2 != null ? str2.GetHashCode() : 0);       
    }   
}

今、簡単に、ios、androidとmac用にc#を示唆する:

public int GetHashCode()
{
    unchecked
    {
        int hashCode;

        // String properties
        hashCode = (hashCode * 397) ^ (str1!= null ? str1.GetHashCode() : 0);
        hashCode = (hashCode * 397) ^ (str2!= null ? str1.GetHashCode() : 0);

        // int properties
        hashCode = (hashCode * 397) ^ intProperty;
        return hashCode;
    }
}

397するのに十分なサイズを向上させることができ、結果変数をオーバーフローやミックスのビットのハッシュや、流通のハッシュコードです。それ以外の場合は、何も特別に397ることを区別するようになりますので、素数が同じ大きくなりました。

Ahあり、ゲイリー-Shutler可能性が指摘され

return str1.GetHashCode() + str2.GetHashCode();

できるオーバーフロー.きみ鋳造してArtemと言われており、またサラウンドの算書のチェックなキーワード:

return unchecked(str1.GetHashCode() + str2.GetHashCode());

みす:

(((long)str1.GetHashCode()) + ((long)str2.GetHashCode())).GetHashCode()

多くの可能性が広がる。E.g.

return str1.GetHashCode() ^ str1.GetHashCode()

そのようなものstr1.GetHashCode()+str2.GetHashCode()?(str1.GetHashCode()+str2.GetHashCode())/2?この方法でも同じですか否かを問わずstr1とstr2と交換する....

整理し、その後の連結:イメージ

return ((str1.CompareTo(str2) < 1) ? str1 + str2 : str2 + str1)
    .GetHashCode();

GetHashCodeの結果がっていると:

  1. とが可能です。
  2. どが可能です。

軸受の方にもうって思ったこと。

if (str1 == null)
    if (str2 == null)
        return 0;
    else
       return str2.GetHashCode();
else
    if (str2 == null)
        return str1.GetHashCode();
    else
       return ((ulong)str1.GetHashCode() | ((ulong)str2.GetHashCode() << 32)).GetHashCode();

編集: を忘れてしまったのnull.コードを修正。

複雑すぎて、つのを忘れnull。このようなbucketingいくようなもの

if (null != str1) {
    return str1.GetHashCode();
}
if (null != str2) {
    return str2.GetHashCode();
}
//Not sure what you would put here, some constant value will do
return 0;

この偏りがあると仮定してstr1ができることを異常に大きな割合を占める場合がございます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top