CRC32为网站制作简短的网址
题
我正在尝试了解crc32以生成网页的唯一网址。
如果我们使用crc32,可以使用的最大网址数是多少,以便我们可以避免重复?
将校验和保持为2 ^ 32的近似字符串长度是什么?
当我为一个url尝试UUID并将uuid字节转换为base 64时,我可以减少到22个字符长。我想我可以进一步减少。
通常我想将网址(最多1024个字符)转换为短信ID。
解决方案
没有这样的数字,因为“可以使用最大网址数量,以便我们可以避免重复”。对于CRC32。
问题在于CRC32可以产生重复,并且它不是你抛出多少值的函数,它是这些值看起来的函数。
如果你运气不好,你可能会在第二个网址上发生冲突。
您不应将算法建立在生成唯一哈希的基础上,而是手动为每个网址生成唯一值。
其他提示
如果您已经将完整的URL存储在数据库表中,则整数ID非常短,可以通过将其转换为基数16,64或85来缩短。如果您可以使用UUID,则可以使用整数,你也可以,因为它更短,我不知道UUID会在你的查找表中提供什么好处。
制作短URL的正确方法是将完整的URL存储在数据库中并发布映射到行索引的内容。例如,紧凑的方法是使用行ID的Base64。或者您可以使用UID作为主键并显示。
不要使用校验和,因为它太小而且很可能会发生冲突。加密哈希值越大越不可能,但它仍然不是正确的方法。
CRC32表示带有32位的循环冗余校验,其中任意数量的位总计为32位校验和。并且校验和函数是满射的,这意味着多个输入值具有相同的输出值。所以你不能反转这个功能。
不,即使您使用md5或任何其他支票金额,网址也可以重复,这一切都取决于您的运气。
所以不要在这些支票金额上建立一个独特的网址
解决问题的最快(也许最好!)方法可能是简单地使用本地路径的散列和给定URI的查询,如下所示:
using System;
namespace HashSample
{
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri(
"http://host.com/folder/file.jpg?code=ABC123");
string hash = GetPathAndQueryHash(uri);
Console.WriteLine(hash);
}
public static string GetPathAndQueryHash(Uri uri)
{
return uri.PathAndQuery.GetHashCode().ToString();
}
}
}
以上假设URI方案和主机保持不变。如果不是,GetHashCode将使用任何字符串。
关于CRC32 Hash Collision的一个很好的讨论访问: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831