Bashでの固有乱数(UUID)の生成

Bashでの固有乱数(UUID)の生成

以下のようにランダムな固有番号(UUID)を作成したいと思います。

node.id=ffffffff-ffff-ffff-ffff-ffffffffffff

最初はこれを試しました。

$ rndnum=` echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM"-"echo $RANDOM`

$ echo $rndnum
30380-echo 21875-echo 14791-echo 32193-echo 11503

次を生成する正しい方法は何ですか(f数値を含む)?

ffffffff-ffff-ffff-ffff-ffffffffffff

答え1

Linuxでは、util-linux/util-linux-ngパッケージはUUIDを生成するためのコマンドを提供しますuuidgen

$ uuidgen
5528f550-6559-4d61-9054-efb5a16a4de0

引用する手動:

uuidgenプログラムは、(3)ライブラリを使用してlibuuid新しいUUID(Universally Unique Identifier)を作成(および印刷)します。新しいUUIDは、過去および将来の他のシステムで生成されたUUIDだけでなく、ローカルシステムで生成されたすべてのUUIDの中で一意であると合理的に見なすことができます。

uuidgenは、時間ベースのUUIDとランダムベースのUUIDの2種類のUUIDを生成できます。デフォルトでは、uuidgenは高品質の乱数ジェネレータが利用可能な場合はランダムベースのUUIDを生成します。それ以外の場合は、時間ベースのUUIDを選択します。-rまたは、オプションを使用して両方の-tUUIDタイプのいずれかを強制的に生成できます。

付録:OPはコメントへのリンクを提供しました。Presto DB ドキュメント。いくつかの検索の最後に見つかったこの関連議論node.idプロパティが実際にUUIDであることを明確に言及します。


コメントにFrostschutzが提供する情報を追加します。

uuidgen/メソッドの代わりに、libuuidLinuxカーネル自体が公開するインターフェースを利用してUUIDを作成できます。

$ cat /proc/sys/kernel/random/uuid
00db2531-365c-415c-86f7-503a35fafa58

UUID は要求ごとに再生成されます。

答え2

@frostschutzが述べたように、依存関係のないソリューションを使用できます。

cat /proc/sys/kernel/random/uuid

または変数を保存

UUID=$(cat /proc/sys/kernel/random/uuid)

Bashでは、これを次のように単純化できます。

UUID=$(< /proc/sys/kernel/random/uuid)

答え3

Raspberry Pi(および他の場合もあります)では、コマンドは簡単です。

uuid

プリインストールされている必要がありますが、そうでない場合は、次のことを行う必要があります。 sudo apt install uuid

答え4

以下は、UUIDバージョン4を生成するbashスクリプトです。RFC 4122

UUID バージョン 4 は、実際の乱数または擬似乱数に基づいていることを意味します。

#! /bin/bash

printf "%04x%04x-%04x-%04x-%04x-%04x%04x%04x\n" \
$RANDOM $RANDOM \
$RANDOM \
$(($RANDOM & 0x0fff | 0x4000)) \
$(($RANDOM & 0x3fff | 0x8000)) \
$RANDOM $RANDOM $RANDOM

$(($ランダム& 0x0fff | 0x4000))- 残りの4つのランダムビットを次に置き換えます。0100部分として定義4.4そして4.1.3RFC。

$(($ランダム& 0x3fff | 0x8000))- 左側の2つのランダムビットを次に置き換えます。10部分定義によると4.4RFC。

関連情報