Javascript实现的一种简单的推荐码算法

在app开发中遇到这样的需求
1.根据数据库中用户ID生成一个字符串 此字符串作为用户的推荐码 与用户ID一样 具备唯一性
**2.根据特定的算法 可以将该推荐码转化为用户id **

即 算法满足下面的需求

var cipher = encode(id,secret); //根据用户id生成推荐码
var id = decode(cipher,secret); //根据推荐码 解码出用户id

以下为js简易实现过程

//注意 secret中的字符不能重复 且加密解密过程中使用的secret必须一致

function encode(num,secret){

    if(typeof secret!=='string'){
        throw new Error('illegal secret!');
    }
    var arr = [];
    var n =secret.length;
    (function(num){
        arr.push(num%n)
        if(num >= n){
            arguments.callee(Math.floor(num/n))
        }
    })(num)
    return arr.map(function(item){return secret[item]}).reverse().join('');
}

function decode(str,secret){

    if(typeof secret!=='string'){
        throw new Error('illegal secret!');
    }
    var n =secret.length;
    var arr = str.split('').reverse().map(function(item){
            return secret.indexOf(item);
        })
    var result=0;
    for(var i = 0;i<arr.length;i++){
        result +=Number(Math.pow(n,i)*arr[i])
    }
    return result;
}

//使用示例:
var secret ='zabcdefghjklmnpqrstuvwxy23456789'.split('').sort(function(){return Math.random()-0.5}).join('');

document.write('密码是:'+secret+'<br/>');
document.write('明文是:'+13005448800+'<br/>');
var cipher =  encode(13005448800,secret);
document.write('密文:'+cipher+'<br/>');
document.write('解码后:'+decode(cipher,secret));

注意:

  • 这是一个简易实现 在实际使用中需要对明文id和密文secret进行格式校验
  • 当然 稍作改动 也可以根据id范围 生成指定长度的字符串 例如 特定6位推荐码等
    原文作者:ray0324
    原文地址: https://www.jianshu.com/p/9995cc192588
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞