短网址算法实现及短网址算法实现原理

2021-09-07 14:32:56

阅读 2055

短网址算法实现如下所示,代码采用nodejs,业务逻辑实现参考如下:
将长网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节,对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理,这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串。总的 md5 串可以获得 4 个 6 位串,取里面的任意一个就可作为这个长 url 的短 url 地址。查询库中短url是否存在,如果存在则重新来过,不存在直接存入即可。

function EncodeStr(number) {

    if(!parseInt(number)){
        let codemsg = "请传入数字类型";
        return {
            success:false,
            msg:codemsg
        }
    }
    let randomInsertStr = 'a';
    var chars = '0123456789bcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split(''),
        radix = chars.length,
        qutient = +number,
        arr = [];
    do {
        mod = qutient % radix;
        qutient = (qutient - mod) / radix;
        arr.unshift(chars[mod]);
    } while (qutient);
    let  codeStr = arr.join('');
    codeStr = codeStr.length < 6 ?  (codeStr+randomInsertStr + randomWord(false,5-codeStr.length,0,[randomInsertStr])):codeStr;
    return codeStr;
}
let randomWord = (randomFlag, min, max,ruledOutStr)=>{
    var str = "",
        range = min,
        pos='',
        arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    if(ruledOutStr){
        ruledOutStr.map(item=>{
            arr = arr.join("").split(item).join('').split('')
        })
    }

    // 随机产生
    if(randomFlag){
        range = Math.round(Math.random() * (max-min)) + min;
    }
    for(var i=0; i         pos = Math.round(Math.random() * (arr.length-1));
        str += arr[pos];
    }
    return str;
};

缩短网址其实就是采用一定的算法将长URL进行处理,然后得出唯一的短码,这个短码和长url是一一对应的,不能重复,然后将短码存储起来,当使用短码访问的时候,查询出其对应的长URL,进行重定向即可。


一般采用的算法有两种:自增ID法和摘要算法。


自增ID法
    自增ID的方法也叫做永不重复法,即采用发号器原理来实现,每一个url对应一个数字,然后自增,可以理解为ID,然后将ID进行相应的转换(比如进制转换),由于ID是唯一的,所以转换出来的结果也是唯一的。短网址的长度一般设为 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 总共 62 个字母组成的,所以 6 位的话,总共会有 62^6 ~= 568亿种组合,基本上够用了。


    理论说完了,我们来看一下具体的实现算法步骤:


    首先,获取长URL,将长url计算成md5值,判断库(这个库可以是redis或mysql获取noSql等数据库)中是否存在该md5值对应的短码,如果有,直接返回;如果没有,将url,md5存入数据库中,并返回该条记录的id值,此ID值作为生成短链的一个依据。这里为什么将url转换成md5,原因在于长url可能是一个很长的串,在数据库中查询是很费时的,尤其是作为redis的key值,更是不可取的。


    然后将返回的ID转换为61进制,将字母或数字中的其中一个取出作为连接符使用,这里我们使用小写字母a,然后拼接到转换完进制的字符串后,不足六位的用随机字符补足,随机字符中也要相应的踢除掉该连接符字符,用以保证六位短码唯一。


    短码已经生成,直接返回就好。在之后就是输入短码来重定向了,我们可以在库中查询该短码对应的长url,然后重定向到长url地址即可。


流程图如下



        缩我,高速云服务器
        实时掌握推广动态
        让您深入了解用户,提高推广转化率

        相关推荐
      1. 短链接如何限制地域、时间段访问?简单三步,满足个性化推广需求!
      2. 链接没有私密性?简单一步,为您链接保驾护航
      3. 如何使用同一网址生成为不同的短链接功能来提升推广转化?
      4. 我的短链:满足多样化推广需求,实现短链接在线管理
      5. 联系我们
        1. 联系客服
          常见问题
      6. 公众号
        客服微信