C# 在C中创建URL短代码#

C# 在C中创建URL短代码#,c#,hash,md5,C#,Hash,Md5,我正在使用创建URL的短代码 我已经为此工作了一段时间,而伪代码对我来说毫无意义。他在“loop1”中说,我应该从前4个字节到第4个4个字节,然后将字节转换为整数,然后将其转换为位。最后,每4个字节有32位,但他在“loop3”中使用了5个字节,不能被32整除。我不明白他想说什么 然后我注意到,在您将短代码写入数据库之后,他关闭了底部的“loop2”。这对我来说毫无意义,因为我会一遍又一遍地向数据库中写入相同的短代码 然后我有一个“loop1”,它将循环到无穷大,再次我不明白为什么我需要将数据库

我正在使用创建URL的短代码

我已经为此工作了一段时间,而伪代码对我来说毫无意义。他在“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;
            }

        }
private void按钮1\u单击(对象发送者,事件参数e)
{
string codeMap=“abcdefghijklmnopqrstuvxyz012345”//32字节
//计算MD5散列
MD5 MD5=MD5.Create();
byte[]inputBytes=Encoding.ASCII.GetBytes(txtURL.Text);
byte[]hash=md5.ComputeHash(inputBytes);
//从前4个字节循环到第4个4字节
字节[]四字节=新字节[4];

对于(inti=0;i您的MD5哈希是128位。其思想是用6个字符表示这128位,理想情况下不会丢失任何信息

代码映射包含32个字符

string codeMap = "abcdefghijklmnopqrstuvwxyz012345"
请注意,2^5也是32。第三个循环一次使用哈希的5位,并将这5位转换为代码映射中的一个字符。例如,对于位模式

00001 00011 00100
  b     d     e
该算法使用6组5位,因此总共30位。2位被“浪费”

请注意,128位MD5一次占用4个字节,这4个字节被转换为整数。这是消耗MD5位的一种方法,但肯定不是唯一的方法。它涉及位屏蔽和位移位

您可能会发现在实现中使用a更为简单。虽然这可能会稍微降低效率,但这可能无关紧要。如果您使用该路径,请使用MD5哈希的位初始化位数组,然后一次只取5位,将其转换为0..31范围内的数字,以用作代码映射的索引

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

6个字符的短代码可用于映射32^6(1073741824)个URL,因此在不久的将来不太可能用完


由于散列冲突的可能性,系统可以管理远少于10亿个URL,而不存在将同一短URL分配给两个长URL的重大风险。有关更多信息,请参阅。

除非您希望使用非常流行的URL缩短器,否则只需使用数据库自动增量列中的base 16或base 64即可


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

这不会导致哈希的每32位使用代码映射中的6个字符,这意味着缩短后的URL将使用代码映射中的48个字符吗?我在这里遗漏了什么?显然,我让它变得更复杂了。我发现了一个上传更多有帮助的文档,但我无法使用。我的代码太大,无法上传到评论中,但如果有人想查看我的操作,我会将其上传到这里:.-谢谢。@JohnHodge:您需要5位来表示32个字符(2^5),而不是32位。那么呢第三个循环一次使用5位散列,并将这5位转换为代码映射中的一个字符。"?@JohnHodge:从128位散列中提取5位。将它们转换为一个数字,范围在0到31之间。使用0到31之间的数字作为索引从codeMap中查找字符。总共重复6次。我曾想过这样的解决方案。如果我无法使MD5解决方案正常工作,我想这将是我的第二个选择。-Th脚踝。