我创建一个GUID(作为字符串)并获取它的哈希值。我可以认为这个哈希值是唯一的吗?
答案 0 :(得分:19)
不像GUID本身那样可靠唯一,没有。
只是为了扩展,你将你的唯一性降低4倍,从16个字节到4个字节的可能组合。
正如评论中所指出的,散列大小会有所不同。这个4字节的东西是一个假设,我知道它最糟糕的是它可以在.NET中使用,其中默认的散列大小是4个字节(int)。所以你可以用你的哈希字节大小替换我上面所说的内容。
答案 1 :(得分:9)
不。
如果您需要迷你GUID,请参阅此处:http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
答案 2 :(得分:7)
总之,没有。
让我们假设您的哈希比GUID更少的位,根据鸽子原则,必须存在一些GUID的多个映射 - >哈希只是因为哈希比GUIDS少。
如果我们假设散列的位数比GUID大,那么假设你正在使用一个好的散列函数,那么碰撞的可能性非常小 - 但是有限 - 。
答案 3 :(得分:4)
没有将任意大小的数据块减少到固定大小的位数的散列函数将在两者之间产生1对1的映射。总是有可能将两个不同的数据块减少到散列中相同的位序列。
良好的哈希算法可以最大限度地减少这种情况发生的可能性,通常,哈希中的位越多,冲突的可能性就越小。
答案 4 :(得分:2)
由于哈希冲突,无法保证。 GUID本身几乎可以保证。
出于实际原因,您可能会认为散列是唯一的,但为什么不使用GUID本身?
答案 5 :(得分:2)
不,我不会假设任何哈希值的唯一性。这应该不重要,因为哈希值不需要唯一,它们只需要在它们的范围内均匀分布。分布越均匀,发生的冲突越少(在哈希表中)。较少的冲突意味着更好的散列表性能。
fyi有关哈希表如何工作的详细说明,请阅读What are hashtables and hashmaps and their typical use cases?
的已接受答案答案 6 :(得分:0)
如果使用加密哈希(MD5,SHA1,RIPEMD160),哈希将是唯一的(模数冲突是非常不可能的 - SHA1用于例如数字签名,MD5也是随机冲突的输入)。但是,为什么要散列GUID?
答案 7 :(得分:0)
我想将GUID哈希化为X大小,这是因为有时我会设置10个或更少的GUIDS,所以与如果我拥有10,000,000 GUID的情况相比,我可能会得到较短的哈希而不会发生冲突。我只想能够在调用函数时指定哈希的大小。