【JavaScript】数値をアルファベット文字列に変換するencode/decode関数の実装方法
はじめに
ログインシステムを構築する際、ユーザーを一意に識別するために固有のユーザーID(userID)を割り当てるのが一般的です。しかし、連番などの単純な数値IDは推測されやすいため、セキュリティ上の観点から何らかの形で難読化したいケースがあります。
そこで本記事では、数値とアルファベット文字列を相互に変換する、次の2つの関数を実装していきます。
- encode() … 数値を26種類のアルファベットによる表記に変換する
- decode() … 変換された文字列を元の数値に復元する
なお、実際のセキュリティ対策ではSHA-256のようなハッシュアルゴリズムが使われることが多いですが、これらは元に戻せない一方向性の変換のため、双方向の変換には向いていません。今回はあくまで学習目的として、可逆的な変換を扱うことにします。
変換の仕組み
今回のアプローチでは、0〜25の各数値を「z」「a」〜「y」の26文字に対応させます。これはいわゆる26進法への変換であり、数値を繰り返し26で割って、その余りを文字にマッピングしていくことで実現できます。
例えば、数値 31 を変換すると次のようになります。
encode(31) = 'ea'
decode('ea') = 31
計算の流れを見てみましょう。まず 31 ÷ 26 の商は1、余りは5です。余り5は文字「e」に、次の商1は文字「a」に対応するため、「ea」という結果が得られます。
コード例
実際のコードは以下のとおりです。
const num = 31;
const encode = num => {
let res = '';
const legend = 'zabcdefghijklmnopqrstuvwxy';
while (num) {
const rem = num % (legend.length);
res += legend[rem];
num = Math.floor(num / legend.length);
}
return res;
};
const decode = str => {
let num = 0;
const legend = 'zabcdefghijklmnopqrstuvwxy';
for (let i = 0; i < str.length; i++) {
const ind = legend.indexOf(str[i]);
num += ind * Math.pow(legend.length, i);
}
return num;
};
console.log(encode(num));
console.log(decode('ea'));
encode関数の解説
encode関数では、数値が0になるまでwhileループで以下の処理を繰り返します。
- 数値を26(legendの長さ)で割った余りを求める
- 余りをインデックスとしてlegendから対応する文字を取り出し、結果文字列に連結する
- 数値を26で割った商(小数点以下は切り捨て)で更新する
これにより、下位の桁から順に文字が生成されていく仕組みになっています。
decode関数の解説
decode関数では、文字列の先頭から順に各文字を処理します。
legend.indexOf()で文字に対応する数値インデックスを取得する- そのインデックスに26のi乗を掛けて桁の重みを計算し、合計に加算する
すべての文字を処理した時点での合計値が、元の数値となります。
出力結果
コンソールの出力は以下のとおりです。
ea
31
まとめ
このように、剰余演算とべき乗を組み合わせることで、数値とアルファベット文字列を簡単かつ可逆的に相互変換できます。ユーザーIDの難読化や短縮URLの生成など、さまざまな場面で応用できる考え方なので、ぜひ押さえておきましょう。ただし、本格的なセキュリティが求められる場面では、暗号学的ハッシュ関数や暗号化ライブラリの利用を検討してください。
-
JavaScriptで数値の最大桁を求める再帰関数の実装方法
概要JavaScriptでは、引数として受け取った数値の中から最大の桁(いちばん大きい数字)を返す再帰関数を書く必要がある場合があります。たとえば、数値が 45654356 の場合、含まれる数字は 4・5・6・5・4・3・5・6 なので、その中で最も大きい数字は 6 です。したがって、この関数の戻り値は 6 になるべきです。コード例この処理を実装したコードは以下のとおりです。 { if(num){ const max = Math.max(num % 10, greatest); return greatestDigit(Math.floor(num /
-
【JavaScript】数値の約数をすべて求める関数の実装方法
はじめに本記事では、正の整数を1つ引数として受け取り、その数を余りなく割り切れるすべての数(約数)を配列として返すJavaScript関数の実装方法を解説します。問題の定義作成する関数は、正の整数を唯一の引数として受け取ります。そして、入力された数値を完全に割り切れるすべての数値を要素とする配列を構築して返す必要があります。例えばー入力が次の数値だった場合:const num = 12;期待される出力は以下のとおりです。const output = [1, 2, 3, 4, 6, 12];12の場合、1・2・3・4・6・12の6つの整数が12を割り切れるため、これらが約数となります。実装コード