在c#中创建URL短代码

本文关键字:代码 URL 创建 | 更新日期: 2023-09-27 17:50:20

我将使用本文为URL创建一个简短的代码。

我已经做了一段时间了,伪代码对我来说没有任何意义。他在"loop1"中指出,我应该从前4个字节到第4个字节,然后将字节转换为整数,然后将其转换为位。每4个字节有32个字节,但他在"loop3"中使用了5个字节,这个不能被32整除。我不明白他想说什么。

然后我注意到,在你写完短代码到数据库之后,他在底部关闭了"loop2"。这对我来说没有任何意义,因为我将一遍又一遍地向数据库编写相同的短代码。

然后我有"loop1",它将循环到无穷大,我也不明白为什么我需要将数据库更新到无穷大。

我试着按照他的例子,在调试器中逐行运行,但这没有意义。

这是我到目前为止,根据我已经能够理解的代码:

        private void button1_Click(object sender, EventArgs e)
    {
        string codeMap = "abcdefghijklmnopqrstuvwxyz012345"; // 32 bytes
        // Compute MD5 Hash
        MD5 md5 = MD5.Create();
        byte[] inputBytes = Encoding.ASCII.GetBytes(txtURL.Text);
        byte[] hash = md5.ComputeHash(inputBytes);
        // Loop from the first 4 bytes to the 4th 4 bytes
        byte[] FourBytes = new byte[4];
        for (int i = 0; i <= 3; i++)
        {
            FourBytes[i] = hash[i];
            //int CastedBytes = FourBytes[i];
            BitArray binary = new BitArray(FourBytes);
            int CastedBytes = 0;
            for(int ii = 0; i <=5; i++)
            {
                CastedBytes = CastedBytes + ii;
            }
        }

谁能帮我找出我做错了什么,这样我就可以让这个程序工作?我只需要将url转换成短的6位唯一代码。

谢谢。

在c#中创建URL短代码

MD5哈希值为128位。这个想法是用6个字符表示这128位,理想情况下不会丢失任何信息。

codeMap包含32个字符

string codeMap = "abcdefghijklmnopqrstuvwxyz012345"

注意2^5也是32。第三个循环每次使用5位哈希,并将这5位转换为codeMap中的一个字符。例如,对于位模式

00001 00011 00100
  b     d     e

算法使用6组5位,共30位。2位被"浪费"了。

请注意,128位MD5每次使用4个字节,并且这4个字节被转换为整数。这是一种使用MD5比特的方法,但肯定不是唯一的方法。它包括位掩码和位移位。

您可能会发现使用BitArray来实现更直接。虽然这可能会稍微降低效率,但这可能无关紧要。如果你走这条路,用MD5哈希的比特初始化BitArray,然后每次只取5比特,将它们转换成0范围内的数字。

文章中的这一点是误导

6个字符的短代码可以用来映射32^6(1,073,741,824)个url,所以它不太可能在不久的将来用完

由于哈希冲突的可能性,系统可以管理远少于10亿个URL,而不会出现将相同的短URL分配给两个长URL的重大风险。

除非你希望有一个非常流行的URL缩短器,否则只使用基数为16或64的数据库自动增量列。

Base 16将提供1600万个唯一url。64进制将提供~2^^36。