短网址算法实现及短网址算法实现原理-威尼斯37266

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

2021-09-07 14:32:56

阅读 1376

威尼斯37266-正版威斯尼斯人8206下载安装算法实现如下所示,代码采用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;
};

威尼斯37266-正版威斯尼斯人8206下载安装其实就是采用一定的算法将长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地址即可。


流程图如下



缩我,高速云服务器
实时掌握推广动态
让您深入了解用户,提高推广转化率
联系正版威斯尼斯人8206下载安装
    1. 关注官方微信公众号
      联系客服
      常见问题
  • 公众号
    客服微信
  • 关注官方公众号
  • 联系客服
  • 网站地图