我希望能够从所有对象中获得 uniqe哈希。还有什么, 在
的情况下Dictionary<string, MyObject> foo
我想要的唯一键是:
等。
object.GetHashCode()不保证不同对象的唯一返回值。 这就是我需要的。
有什么想法吗?谢谢
答案 0 :(得分:4)
“唯一哈希”通常是一个矛盾,即使是一般术语(如果您尝试使用Int32
作为哈希值,则更明显是不可能的)。来自维基百科条目:
哈希函数是任何明确定义的 程序或数学函数 转换大,可能 可变大小的数据量 小数据,通常是一个整数 可以作为一个索引 阵列。哈希返回的值 函数被称为哈希值,哈希值 代码,哈希值或哈希值。
注意“小数据”位 - 换句话说,会有比可能的哈希值更多的可能对象,因此您不可能具有唯一性。
现在,听起来你真的希望哈希是一个字符串...这意味着它不会是一个固定的大小(但将必须低于2GB或任何限制是)。产生这种“唯一散列”的最简单方法是序列化对象并将结果转换为字符串,例如如果它是二进制序列化格式,则使用Base64;如果是基于文本的文本(如JSON),则使用文本。然而,这并不是其他任何人真正认为的“哈希”。
答案 1 :(得分:3)
简单地说这是不可能的。 GetHashCode函数返回一个有符号整数,其中包含2 ^ 32个可能的唯一值。在64位平台上,您可以运行多于2 ^ 32个不同的对象,因此它们不能都具有唯一的哈希码。
解决此问题的唯一方法是创建一个不同的散列函数,该函数返回一个容量大于或等于可在正在运行的系统中创建的值的类型的类型。
答案 2 :(得分:2)
如果没有输入空间的限制,则无法使用唯一的哈希码。这是因为Object.GetHashCode
是int
。如果您有超过Int32.MaxValue
个对象,则其中至少有两个必须映射到相同的哈希码(pigeonhole principle)。
定义具有约束输入的自定义类型(即,直到相等的可能不同对象的数量小于Int32.MaxValue
)然后,只有这样,才有可能产生唯一的哈希码。这并不是说这很容易,只是可能。
或者,不要使用Object.GetHashCode
机制,而是使用其他一些表示哈希的方法,你可以做你想做的事。我们需要明确您想要的详细信息,并使用它来帮助您。
答案 3 :(得分:1)
正如其他人所说,哈希码永远不会是唯一的,这不是重点。
重点是帮助您Dictionary<string, MyObject> foo
找到确切的实例更快。它将使用哈希代码将搜索范围缩小到较小的对象集,然后检查它们是否相等。
如果您需要的是唯一键,则可以使用Guid类来获取唯一字符串。但这不是哈希码。