在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位推荐码等