TeX Alchemist Online

TeX を使って化学のお仕事をしています。

TeX で UUID を生成する

本日リリースされた TeX Live 2019 において,XeTeX に擬似乱数生成関連のプリミティブ \uniformdeviate‌ / \normaldeviate‌ / \randomseed / \setrandomseed が追加され,主要 TeX エンジンに乱数生成プリミティブが出揃うこととなりました。乱数生成プリミティブについての詳細は TeX & LaTeX Advent Calendar 201819日目の記事で述べたとおりです。

doratex.hatenablog.jp

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-xxxxxxxxxxxxM の桁はバージョンを表す 4 でなくてはならず,N の桁は(上位 2bit が RFC 4122 バリアントを表す 10 でなくてはならないため)8, 9, A, B のいずれかでなければなりません。

UUID Version 4 の仕様を満たす UUID 生成のコードは,世間にたくさんサンプルが見つかります。たとえば,Javascript による簡単なジェネレータ実装が Gist に見つかりました。

gist.github.com

このコード中の 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 のように英小文字で得られます。