更新
以下代码完美无缺,直到$ char.to_text遇到大于54,634,574,847的整数。
alpha="abcdefghijklmnopqrstuvwxyz";
$char={
to_num:function(s,c){
var l=c.length,o={};
c.split('').forEach(function(a,i){
o[a]=i
});
return s.split('').reduce(function(r,a){
return r*l+o[a]
},0)
},
to_text:function(i,c){
var l=c.length,s='';
do{
s=c[i%l]+s; // i%l
i/=l;
i|=0
}while(i!==0);
return s
}
};
这是一个快速剪辑:
$char.to_num("military",alpha) => 98987733674
$char.to_text(98987733674,alpha) => "undefinedundefinedundefinedundefinedundefinedundefinedundefinedy"
手动迭代上面的代码应该生成一个正常的响应,为什么它会产生这个“undefined ...”字符串,是不是因为它是JS的大量操作?
答案 0 :(得分:2)
这是一个包含重写hash
函数的提案,它使用对象o
作为简化indexOf
,并使用简单的循环作为返回值。
想要的函数ihash
使用单个do ... until
循环。它使用值的剩余部分和长度作为给定字符集的索引。然后将该值除以该字符集的长度,如果不等于零,则将整数部分用于下一次迭代。
function hash(s) {
var c = '0abcdefghijklmnopqrstuvwxyz',
l = c.length,
o = {};
c.split('').forEach(function (a, i) {
o[a] = i;
});
return s.split('').reduce(function (r, a) {
return r * l + o[a];
}, 0);
}
function ihash(i) {
var c = '0abcdefghijklmnopqrstuvwxyz',
l = c.length,
s = '';
do {
s = c[i % l] + s;
i = Math.floor(i / l);
} while (i !== 0);
return s;
}
document.write(hash('0') + '<br>'); // => 0
document.write(hash('a') + '<br>'); // => 1
document.write(hash('hi') + '<br>'); // => 225
document.write(hash('world') + '<br>'); // => 12531838
document.write(hash('freecode') + '<br>'); // => 69810159857
document.write(ihash(0) + '<br>'); // => '0'
document.write(ihash(1) + '<br>'); // => 'a'
document.write(ihash(225) + '<br>'); // => 'hi'
document.write(ihash(12531838) + '<br>'); // => 'world'
document.write(ihash(69810159857) + '<br>'); // => 'freecode'
&#13;
答案 1 :(得分:0)
这是一个用于获取字符串的伪代码。它类似于转换不同基数的数字。
var txt = function(n, charset) {
var s =""
while (n > 0) {
var r = n % charset.length;
n = n / charset.length;
s += charset[r];
}
return s;
}