2016-07-11 6 views
-1

私はユーザが自分の電話にuserid:sを書き込まなければならないシステムを持っています。私はIDを難読化したい:そうよ、数を推測することはかなり困難であることと、私は、次の文字を使用して、ベース23数に変換したい:私はI、Lをdroppinよ数字を文字に変換しますか?

abcdefghjkmnpqrstuvwxyz 

をこれらの文字はID番号を真剣に吸い込んでいるため、Oを使用します。

入力が23であれば例えば、出力が24ab等私は数字にしようとしている

を(私はこの機能を介してそれらを実行する前に、私は/スクランブルユーザーIDを解読します)になり、aaだろう整数を文字に変換する方法を説明します。これは私がアップcomポートすることができますが最適です。

var scrambled = 234, 
    charmap = ['a','b','c'...] 

scrambled.toString(23) 

ここで私はすべての1文字を[スクランブル]のcharmapを行うと、文字列にそれを保存したいと思い、私は文字列にスクランブルし、それを分割変換することができ、しかし、私はそれを行うよりクリーンな方法があると思います。現代のWeb技術は大丈夫です!

+1

あなたはいくつかのサンプルの入力と出力を共有することができますか? – gurvinder372

+0

正確には、目標を達成できないため、 –

+0

に2つの例が追加されました。 – Himmators

答えて

2

あなたのcharmapは自明ではないので、代わりに独自の関数を書くことができます。 charmapをクロージャーに隠しておきます。あなたはエンコーディングのためのdo-while文を使用して、値の残りの部分との長さを得ることができ

var convert = (function() { 
 
    var base = 23; 
 
    var charmap = "abcdefghjkmnpqrstuvwxyz"; 
 
    return { 
 
    toString: function(i) { 
 
     var result = ""; 
 
     do { 
 
     result = charmap.charAt(i % base) + result; 
 
     i = (i - i % base)/base; 
 
     } while (i > 0); 
 

 
     return result; 
 
    }, 
 
    fromString: function(s) { 
 
     var result = 0; 
     for (var i = 0; i < s.length; ++i) { 
 
     var k = charmap.indexOf(s.charAt(i)); 
 
     result = result * base + k; 
     } 
 

 
     return result; 
 
    } 
 
    }; 
 
}()); 
 

 

 
for (var i = 0; i < 100; ++i) { 
 
    if (convert.fromString(convert.toString(i)) !== i) { 
 
    console.log("error at " + i); 
 
    } 
 
} 
 

 
console.log("ok");

+0

これはスマートです、あなたはスマートです! – Himmators

+0

しかし、私は逆もやってみる必要があります。IEは文字列を整数に変換します。私もそれを逆にすることができます。 – Himmators

+0

0で終わるので、これもまた無限ループを引き起こします。 – Himmators

0

私はその正確なことをやって、C#であり、あなたはJavascriptに変換することができます確信している、この方法を試してみてください:

private static string strBasechars = "BCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    public static string ToBase(long input) 
     { 
      string r = string.Empty; 
      int targetBase = strBasechars.Length; 
      do 
      { 
       r = string.Format("{0}{1}", 
        strBasechars[(int)(input % targetBase)], 
        r); 
       input /= targetBase; 
      } while (input > 0); 

      return r; 
     } 

あなたがかもしれませんが、私は非常にすべての母音を削除することをお勧めいたしますが、いくつかの悪い言葉で終わる:)

+0

クール私はCを書いていませんが、コードに1つまたは2つのコメントがあれば読むのがずっと楽になります:) – Himmators

+0

@Himmators ... Regis Portalezが投稿した2番目の答えをチェックしてください。 。 23は私のサンプルのtargetBaseです...他のすべては同じです –

0

:ここ

は、両サイドの変換対象provinding、完全なフィドルですエンコーディングとデコードのための文字セットは、ハッシュテーブルを使用し、インデックス上の値を計算します。

function encode(value, charmap) { 
 
    var encoded = '', 
 
     l = charmap.length; 
 

 
    do { 
 
     encoded = charmap[value % l] + encoded; 
 
     value = Math.floor(value/l); 
 
    } while (value) 
 
    return encoded; 
 
} 
 

 
function decode(value, charmap) { 
 
    var hash = Object.create(null), 
 
     l = charmap.length; 
 

 
    charmap.split('').forEach(function (a, i) { 
 
     hash[a] = i; 
 
    }); 
 
    return value.split('').reduce(function (r, a) { 
 
     return r * l + hash[a]; 
 
    }, 0); 
 
} 
 

 
var charmap = 'abcdefghjkmnpqrstuvwxyz', 
 
    encodeValue = 23, 
 
    encodedValue = encode(encodeValue, charmap), 
 
    decodedValue = decode(encodedValue, charmap); 
 

 
console.log(encodedValue); 
 
console.log(decodedValue);

関連する問題