【发布时间】:2013-03-07 13:20:26
【问题描述】:
我想在 C# 数组中进行结构散列,但我不知道该怎么做。 在任何语言中,这似乎都是一个非常基本且非常简单的问题,但我无法使其在 C# 中工作......
我有一个 383 双数组。当我散列它时,我得到一个非常奇怪的值
// 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。 (虽然它似乎随着第一个数字而改变......)
结论
实际上,结论似乎是结构散列在 C# 中被破坏了。
(当然,实际上,它不是,因为其他人认为一个几乎恒定的函数是一个有效的散列函数.....)
【问题讨论】:
-
哈希码通常很奇怪。你在期待什么?此外:我想你会同意
134217728实际上是偶数:) -
你想要数组全部内容的哈希码吗?
-
@MatthewWatson 是的,我想要数组内容的哈希码。这样我就可以将它与另一个数组的另一个哈希码进行比较。
-
@nicolas 这正是结构平等的意思;我提供了一个工作正常的例子。你能举一个例子,它不符合你的意图吗?你只是展示你获取一个哈希码,它告诉我们......好吧,绝对没有。您需要比较 2 个哈希码才能做任何有用的事情。
-
它只有在将 EqualityComparer 传递给 GetHashCode() 时才有效,并且仅在 .Net 4 或更高版本中可用。