我正在尝试了解crc32以生成网页的唯一网址。
如果我们使用crc32,可以使用的最大网址数是多少,以便我们可以避免重复?
将校验和保持为2 ^ 32的近似字符串长度是什么?
当我为一个url尝试UUID并将uuid字节转换为base 64时,我可以减少到22个字符长。我想我可以进一步减少。
通常我想将网址(最多1024个字符)转换为短信ID。
答案 0 :(得分:6)
对于CRC32,没有“可以使用的最大网址数以便我们可以避免重复”这样的数字。
问题在于CRC32可以产生重复,并且它不是你抛出多少个值的函数,它是这些值看起来的函数。
如果你运气不好,你可能会在第二个网址上发生冲突。
您不应将算法建立在生成唯一哈希的基础上,而是手动为每个网址生成唯一值。
答案 1 :(得分:4)
如果您已经将完整的URL存储在数据库表中,则整数ID非常短,可以通过将其转换为基数16,64或85来缩短。如果您可以使用UUID,则可以使用整数,你也可以,因为它更短,我不知道UUID会在你的查找表中提供什么好处。
答案 2 :(得分:1)
CRC32表示带有32位的循环冗余校验,其中任意数量的位总计为32位校验和。并且校验和函数是满射的,这意味着多个输入值具有相同的输出值。所以你不能反转这个功能。
答案 3 :(得分:1)
制作短URL的正确方法是将完整的URL存储在数据库中并发布映射到行索引的内容。例如,紧凑的方法是使用行ID的Base64。或者您可以使用UID作为主键并显示。
不要使用校验和,因为它太小而且很可能会发生冲突。加密哈希值越大越不可能,但它仍然不是正确的方法。
答案 4 :(得分:0)
不,即使您使用md5或任何其他支票金额,网址也可以重复,这一切都取决于您的运气。
所以不要在这些支票金额上建立一个独特的网址
答案 5 :(得分:-1)
解决问题的最快(也许最好!)方法可能是简单地使用本地路径的散列和给定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