在app開發(fā)中遇到這樣的需求
1.根據(jù)數(shù)據(jù)庫中用戶ID生成一個(gè)字符串 此字符串作為用戶的推薦碼 與用戶ID一樣 具備唯一性
**2.根據(jù)特定的算法 可以將該推薦碼轉(zhuǎn)化為用戶id **
即 算法滿足下面的需求
var cipher = encode(id,secret); //根據(jù)用戶id生成推薦碼
var id = decode(cipher,secret); //根據(jù)推薦碼 解碼出用戶id
以下為js簡易實(shí)現(xiàn)過程
//注意 secret中的字符不能重復(fù) 且加密解密過程中使用的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));
注意:
- 這是一個(gè)簡易實(shí)現(xiàn) 在實(shí)際使用中需要對明文id和密文secret進(jìn)行格式校驗(yàn)
- 當(dāng)然 稍作改動 也可以根據(jù)id范圍 生成指定長度的字符串 例如 特定6位推薦碼等