我创建一个GUID(作为字符串)并获取它的哈希值。我可以认为这个哈希值是唯一的吗?

有帮助吗?

解决方案

不像GUID本身那样可靠唯一,没有。

只是为了扩展,你将你的唯一性降低4倍,从16个字节到4个字节的可能组合。

正如评论中所指出的,散列大小会有所不同。这个4字节的东西是一个假设,我知道它最糟糕的是它可以在.NET中使用,其中默认的散列大小是4个字节(int)。所以你可以用你的哈希字节大小替换我上面所说的内容。

其他提示

不。

如果你想要一个迷你GUID,请看这里: http: //blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

总之,没有。

让我们假设您的哈希比GUID更少的位,根据鸽子原则,必须存在多个GUID的多个映射 - >哈希只是因为哈希比GUIDS少。

如果我们假设散列的位数比GUID大,那么假设你正在使用一个好的散列函数,那么碰撞的可能性非常小 - 但是有限 - 。

没有将任意大小的数据块减少到固定大小的位数的散列函数将在两者之间产生1对1的映射。总是有可能将两个不同的数据块减少到散列中相同的位序列。

良好的哈希算法可以最大限度地减少这种情况发生的可能性,通常,哈希中的位越多,冲突的可能性就越小。

由于哈希冲突无法保证。 GUID本身几乎可以保证。

出于实际原因,您可能会认为散列是唯一的,但为什么不使用GUID本身?

不,我不会假设任何哈希值的唯一性。这应该不重要,因为哈希值不需要唯一,它们只需要在它们的范围内均匀分布。分布越均匀,发生的冲突越少(在哈希表中)。较少的冲突意味着更好的散列表性能。

fyi有关哈希表如何工作的详细描述,请阅读什么是哈希表和哈希图及其典型用例?

如果使用加密哈希(MD5,SHA1,RIPEMD160),哈希将是唯一的(模数冲突是非常不可能的 - SHA1用于例如数字签名,MD5也是随机冲突的输入)。但是,为什么要散列GUID?

我想将一个GUID哈希到X大小,并意识到有时我在集合中有10个或更少的GUID,所以如果我在一个集合中有10,000,000 GUID,我可能会在没有冲突的情况下使用更短的哈希。我只想在调用函数时指定哈希的大小。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top