ULIDを生成して返すメソッドを作った。

パスワードを生成して返すメソッドを作った。」のつづきです。

開発目的はこのULID(Universally Unique Identifier)の生成だったのですが、こっちの説明を始めるとパスワード生成の話題を入れなくてはなりません。

話が長くならないように順番の工夫をいたしました。それもソースコードを見れば了解いただけるでしょう。

ULID = function() {
	const time = Date.now().toString(36); //タイムスタンプを36進数文字列に変換
	const crop = password(18); //ランダムな36進数文字列を生成
	return time + crop;
}

そです、三行目にパスワード生成のpasswordメソッドを使っているのです。

コードの一行目は、ULID関数(メソッド)の宣言になります。返すものの仕様が固まっているので引数はありません。

二行目では、「Date.now()」で現在のタイムスタンプ、則ち、1970年1月1日0時0分0秒からの経過時間(ミリ秒単位の協定世界時)を数値で取得して、NumberオブジェクトのtoStringメソッドに媒介変数(パラメータ)「36」を指定して、36進数の文字列に変換します。

これがULIDの前半になります。

三行目では、後半の18桁のランダムな36進数文字列をパスワード生成メソッドを利用して生成します。

passwordソッドで、第二引数(アーギュメント)の初期値が36だったのは、36進数が必要だったからでした。

四行目は、それぞれの定数に代入した文字列を連結して返します。

二行目と三行目を持ってきて一行にしちゃってもいいですね。

passwordソッドもコンソールに登録してから、ULIDメソッドを参照すると26桁の36進数文字列を取得できます。(いつものGoogle ChromeのJavascriptコンソールです。)

password = function(lng, scl=36) {
	if(lng<1) return '';
	scl = scl>=2&&scl<=89?scl:36;
	const chars = `0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-./:;<=>?@[]^_{}~`;
	const a32 = crypto.getRandomValues(new Uint32Array(lng));
	return Array.from(a32).map((vc, id, ar)=>chars[vc%scl]).join('');
}
26桁の36進数文字列を取得

これでULIDをバンバン取得できるようになりました。

一意のインデックスの生成について調査していると、UUID(Universally Unique Identifier)について話題、「JavaScriptでUUID風のランダムな文字列とパスワード生成器を作る方法」(感謝。)とかに行き当たりました。

頑張ってますが、Uint32ArrayオブジェクトとかCryptoインターフェースはご存知でないようです。私もでした。でも、おかげでUUIDやパスワード生成についてとっかかりを得ました。

UUIDについて調査していくと「UUIDとULIDを理解していない方は見た方がいい記事」(感謝。)に、最近はULIDというものがあって、タイムスタンプを利用するとありました。

一意のインデックスを、タイムスタンプから生成することを考えていたので、これは幸いでした。

そして、ULIDは36進数で作ります。

自分がどこでそれを知ったのか不明なのですが、ともかく、36進数で全体26桁(128ビット)、タイムスタンプ8桁(48ビット)とランダム18桁(80ビット)で構成された文字列になります。

いろいろと学習の末、ULIDの生成ができるようになりました。128ビットって「340,282,366,920,938,463,463,374,607,431,768,211,456まで表現できる。」ですと、340澗強だよ!数値が天文学的を越え過ぎて、それだけでむつかしい。そかさ。