本日リリースされた TeX Live 2019 において,XeTeX に擬似乱数生成関連のプリミティブ \uniformdeviate
/ \normaldeviate
/ \randomseed
/ \setrandomseed
が追加され,主要 TeX エンジンに乱数生成プリミティブが出揃うこととなりました。乱数生成プリミティブについての詳細は TeX & LaTeX Advent Calendar 2018 の19日目の記事で述べたとおりです。
UUID Version 4
そこで本日は TeX Live 2019 リリースを祝し,乱数の応用として UUID を TeX で生成してみましょう。UUID とは,衝突の可能性がほとんどなく一意な識別子として利用される 128bit の値です。通常,FCBD2ECC-039C-414B-8868-1594ADA2F8A8
のような16進表示で使われます。Windows では,Microsoft による UUID 実装である GUID をレジストリのエントリなどでよく見ることでしょう。
UUID にはいくつかのバージョンがありますが,UUID Version 4 ならば,乱数のみを用いて生成することができます。
TeX で UUID を生成するサンプルとしては,たとえば Stack Exchange に Generating random uuid in xelatex という項目がありました。ですがこれは単に乱数を32個並べているだけで,UUID Version 4 の仕様 (RFC 4122) を満たしません。UUID Version 4 の仕様に従う場合,xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
の M
の桁はバージョンを表す 4
でなくてはならず,N
の桁は(上位 2bit が
RFC 4122 バリアントを表す 10
でなくてはならないため)8
, 9
, A
, B
のいずれかでなければなりません。
UUID Version 4 の仕様を満たす UUID 生成のコードは,世間にたくさんサンプルが見つかります。たとえば,Javascript による簡単なジェネレータ実装が Gist に見つかりました。
このコード中の random & 3 | 8
という部分は,0~15の乱数 random
を用いて,バリアントを表す N
の桁(8
, 9
, A
, B
)をランダムに得ることを意図しています。ですがTeX言語への移植を考えるとき,ビット演算は(Oberdiek氏による bitset パッケージ を使えば可能ですが)やりにくいので,もっと直接的に,8
, 9
, A
, B
の中からランダムに1つチョイスするようにすればよいでしょう。
UUID 生成用 LaTeX パッケージ
以上に基づき,TeX言語による UUID 生成を LaTeX パッケージの形にまとめておきました(Stack Exchange の回答とほぼ同じ実装になってしまいましたが)。
TeXエンジンにビルトインされた乱数生成プリミティブを用いるので,サポートエンジンは以下の通りとなります。
- pdfTeX
- LuaTeX
- (u)pTeX (TeX Live 2017 以降)
- XeTeX (TeX Live 2019 以降)
\usepakge{uuid}
として
\UUID
とすれば,FCBD2ECC-039C-414B-8868-1594ADA2F8A8
のような文字列が得られます(完全展開可能)。
\usepakge[lowercase]{uuid}
と,lowercase
オプションを付けておけば,出力が fcbd2ecc-039c-414b-8868-1594ada2f8a8
のように英小文字で得られます。