-1

C# 配列で構造ハッシュを実行したいのですが、その方法がわかりません。これは、どの言語でも非常に基本的で非常に単純な質問のように思えますが、C# で機能させることはできません...

私は 383 double の配列を持っています。ハッシュすると、非常に奇妙な値が得られます

// this returns 134217728
let h = ((IStructuralEquatable) data).GetHashCode(EqualityComparer<double>.Default) 

たまたまln h / ln 2 = 27...

ハッシュ可能なものの配列の構造ハッシュコードをC#で取得するにはどうすればよいですか?

より良いイラストを編集

特に、次のコードはばかげた結果を生成します

    var vala = new[] { 1f, 354652f, 3f };
    var valb = new[] { 1f, 56f, 545013f };
    var valc = new[] { 1f, 2584356483f,  68763948475f };

    var hashA = ((IStructuralEquatable)vala).GetHashCode(EqualityComparer<float>.Default);
    var hashB = ((IStructuralEquatable)valb).GetHashCode(EqualityComparer<float>.Default);
    var hashC = ((IStructuralEquatable)valc).GetHashCode(EqualityComparer<float>.Default);

ハッシュは一貫してい796917760ます。(1番で変わるみたいだけど…)

結論

結論としては、実際には、C# では構造ハッシュが壊れているだけのようです。

(もちろん、文字通り、そうではありません。他の人がほぼ一定の関数は有効なハッシュ関数であると主張しているように.....)

4

2 に答える 2

3

GetHashCodeによって返される値は不透明であるため、取得する値は実際には奇妙ではありません。あなたはそれらから情報を引き出すことができるはずがないので、どんな値も他のものと同じくらい奇妙です。

そうは言っIStructuralEquatableても、あなたの問題の解決策として請求されます、そして実際それは私のために働きます:

var a = new[] { 1f, 2f, 3f };
var b = new[] { 1f, 2f, 3f };

var hashA=((IStructuralEquatable)a).GetHashCode(EqualityComparer<float>.Default);
var hashB=((IStructuralEquatable)b).GetHashCode(EqualityComparer<float>.Default);

Console.WriteLine(hashA == hashB); // true
于 2013-03-07T13:22:15.533 に答える
1

構造ハッシュ コードは、2 つの異なるオブジェクト (またはコレクション) が意味的に同じデータを表しているかどうかを示します。正常に動作しています。例えば:

// invent some data
double[] vals1 = new double[383];
Random rand = new Random(12345);
for (int i = 0; i < vals1.Length; i++)
    vals1[i] = rand.NextDouble();
double[] vals2 = (double[])vals1.Clone();

// test with object rules
Console.WriteLine("{0} vs {1}",
    vals1.GetHashCode(), vals2.GetHashCode()); // 2 different numbers
Console.WriteLine(Equals(vals1, vals2)); // False

// now test using structural-equatable rules
IStructuralEquatable se1 = vals1, se2 = vals2;
var comparer = EqualityComparer<double>.Default;
Console.WriteLine("{0} vs {1}",
    se1.GetHashCode(comparer), se2.GetHashCode(comparer)); // 2 identical numbers
Console.WriteLine(se1.Equals(se2, comparer)); // True
于 2013-03-07T13:35:41.600 に答える