使用CRC缩短GUID

时间:2009-07-26 12:24:03

标签: asp.net guid crc

我在ASP.NET中创建一个网站,希望能够拥有一个用户个人资料,可以通过最终用户ID的URL访问。唯一标识符显然是一个糟糕的选择,因为它很长并且(如果我错了,请纠正我)不是真正的URL友好。

我想知道我是否在ASP页面上创建了一个唯一的idnetifier,然后使用CRC(或类似的东西)对其进行哈希处理,如果它仍然像GUID一样唯一(或者甚至是唯一的)。

例如:

GUID 6f1a7841-190b-4c7a-9f23-98709b6f8848等于CRC E6DC2D44。

由于

9 个答案:

答案 0 :(得分:11)

GUID的CRC不是唯一的,不是。那将是一些非常棒的压缩算法,能够将所有内容放入4个字节。

此外,如果您的用户使用GUID密钥存储在数据库中,您将无法找到与此特定CRC匹配的用户。

最好使用普通旧整数来唯一标识用户。如果您希望URL不可用,可以将其与随机生成的第二个票证(或令牌)参数结合使用。它不必是唯一的,因为您使用整数ID来标识用户。您可以将其或多或少视为密码。

答案 1 :(得分:3)

任何计算的哈希都包含比原始数据更少的信息(位),并且永远不会是唯一的。总会有碰撞。

答案 2 :(得分:2)

如果用户有用户名,那么为什么不使用呢?它应该是唯一的(我希望!)并且可能很简短且URL友好。用户也很容易记住,并且符合ASP.NET成员资格方案(因为用户名是成员资格提供者中的“主键”)。我没有看到任何安全问题,因为(大概)只有经过身份验证的用户才能访问它,无论如何?

答案 3 :(得分:1)

不,它不会那么独特,因为你丢失了它的信息。如果您使用32个字符的十六进制字符串并将其转换为8个字符的十六进制字符串,那么根据定义,您将丢失75%的数据。

您可以做的是使用更多字符来表示数据。 guid使用ony 16个字符(base 16),因此你可以使用更高的基数(例如base 64),这样你就可以用更少的字符编码相同数量的信息。

答案 4 :(得分:1)

我认为HTTP URL中的普通GUID没有任何问题。如果您想要缩短形式的Guid,请使用以下内容。

var gid = Guid.NewGuid().ToString("N");

这将提供一个没有任何连字符或特殊字符的GUID。

答案 5 :(得分:1)

GUID是全球唯一的,这意味着你永远不会遇到冲突。这些通常基于某种基于时间的计算,其中插入了随机性。如果你想使用哈希来缩短某些东西,比如CRC,那么它的唯一性不是自动的,只要你自己管理你的唯一性(检查哈希当前是否没有分配给另一个用户,如果是,再生,直到你得到一个独特的)然后你几乎可以使用任何东西。

这是很多网址缩短工作的方式。

答案 6 :(得分:0)

如果您使用UUID / GUID的CRC作为ID,您也可以首先使用较短的ID。

UUID / GUID作为ID的想法是IMO,您可以在断开连接的系统上创建ID,并且应该没有重复ID的问题。

无论如何,谁还要手工输入个人资料页面的网址?

此外,我发现UUID / GUID的URL友好性没有问题 - http不允许使用字符。

答案 7 :(得分:0)

如何在数据库(或用于存储数据的任何其他位置)中识别用户?

如果使用此GUID识别它们,我会说,你有一个非常好的理由,因为这使得搜索特殊ID非常复杂(即使使用二叉树);存储这些值还需要更多空间。

如果它们由唯一的整数值标识,为什么不使用它来调用用户配置文件?

答案 8 :(得分:0)

您可以将GUID缩短为20个可打印的ASCII字符,它仍然是唯一的,不会丢失任何信息。

看看Jeff Atwood撰写的这篇博文:
Equipping our ASCII Armor