CRC32 为网页制作短 URL

发布于 2024-08-04 05:42:31 字数 237 浏览 7 评论 0原文

我试图理解 crc32 来生成网页的唯一 url。

如果我们使用 crc32,为了避免重复,可以使用的最大 url 数量是多少?

保持校验和为 2^32 的近似字符串长度可能是多少?

当我尝试使用 UUID 作为 url 并将 uuid 字节转换为基数 64 时,我可以将长度减少到 22 个字符。我想知道我还能进一步减少。

大多数情况下,我想将 url(最多 1024 个字符)转换为短 ID。

I am trying to understand crc32 to generate the unique url for web page.

If we use the crc32, what is the maximum number of urls can be used so that we can avoid duplicates?

What could be the approximative string length to keep the checksum to be 2^32?

When I tried UUID for an url and convert the uuid bytes to base 64, I could reduce to 22 chars long. I wonder I can reduce still further.

Mostly I want to convert the url (maximum 1024 chars) to shorted id.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

予囚 2024-08-11 05:42:31

CRC32 没有“可以使用的最大 url 数量以避免重复”这样的数字。

问题在于 CRC32 可能会产生重复项,并且它不是您向其传递多少个值的函数,而是这些值的外观的函数。

所以如果你运气不好的话,你可能会在第二个网址上发生冲突。

您不应将算法基于生成唯一的哈希值,而应手动为每个 url 生成唯一的值。

There is no such number as the "maximum number of urls can be used so that we can avoid duplicates" for CRC32.

The problem is that CRC32 can produce duplicates, and it's not a function of how many values you throw at it, it's a function of what those values look like.

So you might have a collision on the second url, if you're unlucky.

You should not base your algorithm on producing a unique hash, instead produce a unique value for each url manually.

江城子 2024-08-11 05:42:31

如果您已将完整 URL 存储在数据库表中,则整数 ID 非常短,可以通过将其转换为基数 16、64 或 85 来使其更短。如果您可以使用 UUID,则可以使用整数,您也可以,因为它更短,而且我看不出 UUID 会在您的查找表中提供什么好处。

If you're already storing the full URL in a database table, an integer ID is pretty short, and can be made shorter by converting it to base 16, 64, or 85. If you can use a UUID, you can use an integer, and you may as well, since it's shorter and I don't see what benefit a UUID would provide in your lookup table.

梦回梦里 2024-08-11 05:42:31

创建短 URL 的正确方法是将完整 URL 存储在数据库中并发布映射到行索引的内容。例如,一种紧凑的方法是使用行 ID 的 Base64。或者您可以使用 UID 作为主键并显示它。

不要使用校验和,因为它太小并且很可能发生冲突。加密哈希更大且可能性更小,但这仍然不是正确的方法。

The right way to make a short URL is to store the full one in the database and publish something that maps to the row index. A compact way is to use the Base64 of the row ID, for example. Or you could use a UID for the primary key and show that.

Do not use a checksum, because it's too small and very likely to conflict. A cryptographic hash is larger and less likely, but it's still not the right way to go.

梦幻之岛 2024-08-11 05:42:31

CRC32 表示 32 位的循环冗余校验,其中任意数量的位都会被累加为 32 位校验和。并且校验和函数是满射的,这意味着多个输入值具有相同的输出值。所以你不能反转这个函数。

CRC32 means cyclic redundancy check with 32 bits where any arbitrary amount of bits is summed up to a 32 bit check sum. And check sum functions are surjective, that means multiple input values have the same output value. So you cannot inverse the function.

甜中书 2024-08-11 05:42:31

不,即使您使用 md5 或任何其他校验和,URL 也可能重复,这完全取决于您的运气。

因此,不要根据这些校验和创建唯一的 url

No, even you use md5, or any other check sum, the URL CAN BE duplicate, it all depends on your luck.

So don't make an unique url base on those check sum

恍梦境° 2024-08-11 05:42:31

解决问题最快(也许也是最好!)的方法可能是简单地使用本地路径的哈希值和给定 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 哈希冲突的精彩讨论,请访问:http: //episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

The quickest (and perhaps best!) way to solve things may be to simply use a hash of the local path and query of a given URI, as follows:

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();
        }
    }
}

The above presumes that the URI scheme and host remain the same. If not GetHashCode will work with any string.

For a great discussion on CRC32 Hash Collision visit: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文