CRC32为网站制作简短的网址

时间:2009-09-09 18:16:33

标签: c# python url crc32 short-url

我正在尝试了解crc32以生成网页的唯一网址。

如果我们使用crc32,可以使用的最大网址数是多少,以便我们可以避免重复?

将校验和保持为2 ^ 32的近似字符串长度是什么?

当我为一个url尝试UUID并将uuid字节转换为base 64时,我可以减少到22个字符长。我想我可以进一步减少。

通常我想将网址(最多1024个字符)转换为短信ID。

6 个答案:

答案 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