在C#中创建URL ShortCode

时间:2015-05-21 01:45:44

标签: c# hash md5

我正在使用this article为网址创建短代码。

我已经在这方面工作了一段时间,伪代码对我没有任何意义。他陈述了" loop1"我应该从前4个字节到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位唯一代码。

感谢。

2 个答案:

答案 0 :(得分:3)

您的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..31范围内的数字,用作codeMap的索引。

文章中的这一点具有误导性

  

6个字符的短代码可用于映射32 ^ 6(1,073,741,824)个网址,因此不太可能在不久的将来用完

由于存在哈希冲突的可能性,系统可以管理远远少于10亿个URL,而不会有将相同的短URL分配给两个长URL的重大风险。有关详情,请参阅Birthday Problem

答案 1 :(得分:1)

除非您希望拥有一个非常受欢迎的URL缩短器,否则只需使用数据库自​​动增量列的base 16或base 64。

Base 16将提供1600万个唯一网址。 Base 64将提供~2 ^^ 36。