回答:
e2fsprogsパッケージのuuidgen
一部であるプログラムを参照してください。
よれば、この、libuuid
今の一部のutil-linuxのとe2fsprogsのに含めることは、段階的に廃止されています。ただし、新しいUbuntuシステムでuuidgen
は、uuid-runtime
パッケージに含まれるようになりました。
uuidを作成して変数に保存するには:
uuid=$(uuidgen)
Ubuntuシステムでは、アルファ文字は小文字で出力され、OS Xシステムでは、大文字で出力されます(コメントで指摘してくれたDavidに感謝します)。
上記のように生成した後、すべて大文字に切り替えるには:
uuid=${uuid^^}
すべて小文字に切り替えるには:
uuid=${uuid,,}
たとえば、2つのUUIDがあり、それらを大文字と小文字を無視してBashで比較したい場合、次のtolower()
ようなスタイル比較を行うことができます。
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
両方の行を出力する)ので、実際には問題ではありません。あなたにとって重要であり、Bash 4を持っている場合、これを行うことで小文字にすることができます:uuid=$(uuidgen); uuid=${uuid,,}
またはこれにより大文字にする:uuid=$(uuidgen); uuid=${uuid^^}
またはこれらの行に沿ってtolower()
スタイルテストを行う:if [[ ${uuid1,,} == ${uuid2,,} ]]
Linuxで外部依存関係を追加せずに多様性を追加するには、次のようにします。
UUID=$(cat /proc/sys/kernel/random/uuid)
FreeBSD上で、Linux互換性レイヤー(linuxulator?)の下で悪い習慣を広めるために、
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
参照:
完全を期すために... dbus
Debianには、パッケージと共にインストールされるUUIDジェネレータもあります。以前見回すのが恋しかった。これはおそらくe2fsprogsパッケージと同じアルゴリズムですが、ダッシュは追加されないため、少しわかりやすいかもしれません。
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawityは安全性のヒントを追加します:「DBus UUIDはRFC 4122に関連していないか、RFC 4122と互換性がありません。さらに、dbus-uuidgenは常に最後の4バイトとしてUnixタイムスタンプを使用します。(ありがとう、Grawity、それをマンページで見つけたはずです。)
dbus-uuidgen
。さらに、最後の4バイトとして常にUnixタイムスタンプを使用します。そのため、一部の用途には適さない場合があります。
他の実行可能ファイルに依存したくない場合、またはそれらを使用できない場合、ここにある純粋なbashバージョンは次のとおりです。
# Generate a pseudo UUID
uuid()
{
local N B T
for (( N=0; N < 16; ++N ))
do
B=$(( $RANDOM%255 ))
if (( N == 6 ))
then
printf '4%x' $(( B%15 ))
elif (( N == 8 ))
then
local C='89ab'
printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
else
printf '%02x' $B
fi
for T in 3 5 7 9
do
if (( T == N ))
then
printf '-'
break
fi
done
done
echo
}
[ "$0" == "$BASH_SOURCE" ] && uuid
T
変数を排除することができ、for T
ループに変更することができる:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(好ましい場合は別々の行に出破壊します)。
case
を削除するために使用しているバージョンを示すgithubリンクのコードにコメントを追加しました。これにより、コードがよりきれいになります。両方があることに注意する必要がありますし、する必要があります。if
for
B%15
B%16
B%255
B%256
source <(curl url)
か、何でも
uuidgenが利用できない場合、このスクリプトが「ワンライナー」であることがわかりました。これにより、PerlまたはPython用の外部モジュールをインストールする必要性も回避されます。
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
SnowLeopard、Red Hat Valhalla、Solaris 9 4/04以降で正常にテストされました。これが非一意性になりやすいかどうか興味がありますが、過去10年間で「噛まれた」ことはありません。もちろん、head -1
交換することhead -_other-value_ | tail -1
もできます。
説明する、
/dev/random
そして、/dev/urandom
乱数発生器をカーネルいます。
od
(8進ダンプ)には、1行あたり16バイトを生成する16進出力スイッチ(-x)があります。
head
-n [| tail -1](n> 0)は、前の出力の1行のみを抽出します。
awk
printステートメントでコンマが出現するすべての場所でOutputFieldSeparatorをハイフンに設定します。フィールド2〜9を個別に指定することにより、ハイフンを制御し、「od」が出力の各行の前に付くインデックス/オフセットカウンターを取り除きます。
結果は8-4-4-4-12
小文字のパターンですa-f0-9
。
993bb8d7-323d-b5ee-db78-f976a59d8284
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
pythonが取り残されているとは感じません。
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
シェルで使用するには:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
生成できるUUIDの種類については、PythonドキュメントのUUIDを参照してください。
非systemdマシンでsystemd machine-id互換ファイルを生成するには、pythonを使用して次のようにします。
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
python3の使用
Perlは、e2fsprogs
パッケージに基づいてUUIDライブラリを提供します。私のDebianシステムでは、これがlibuuid-perl
パッケージです。ワンライナーの例を次に示します。詳細man uuid
を参照してください:
$ perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4
これは、バックスクリプトまたは$()
表記を使用してシェルスクリプトに追加するのは簡単です。
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
Pythonを使用して、任意の数のUUIDを一括生成する小さなBash関数を作成しました。
# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
local count=1
if [[ ! -z "$1" ]]; then
if [[ "$1" =~ [^0-9] ]]; then
echo "Usage: $FUNCNAME [count]" >&2
return 1
fi
count="$1"
fi
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}
小文字を使用する場合は、変更します。
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
に:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
OSSP UUIDライブラリ(http://www.ossp.org/pkg/lib/uuid/)を見て、インストールを検討してください。一部のプロジェクトではオプションとして提供しています(例:PostgreSQL)。 バージョン3およびバージョン5のUUIDを適切に処理します。これは、インストールされている(e2fsprogsなど)ライブラリが処理できる範囲を超えていました。幸いなことに、openSUSEにはメインリポジトリの1つに含まれています。Windows(Cygwinなど)またはMySQLで動作するバージョンを取得することは、失敗です。v3とv5のUUIDが本当に必要なので、Linux / PostgreSQL / Pythonに切り替える時期です(そして、SQLyog GUIからMySQL / MariaDBが大好きです)。
-v3 ns:URL custom-data
シードメカニズムを介したネームスペースもサポートしているため、完璧でした。
ここに到着する人もいると思いますが、スクリプトで使用する一意のIDを生成する簡単な方法を探しているだけで、真のUUIDである必要はありません。
その場合、次の操作を行うだけで、秒まで一意のIDが生成されます。したがって、1秒以内にこれを複数回実行しても、同じ結果が得られます。
MYID="U$(date +%s)"
echo $MYID
現在のシステム時刻に基づいて、次のようなIDを生成します。
U1454423662
注:Linuxを使用している場合、またはCoreutilsをMacにインストールしている場合は、次を使用してナノ秒に対する一意のIDを生成できます。
MYID="U$(date +%s%N)"
echo $MYID
または、ほとんどすべての場所で機能するナノ秒までのPythonベースのソリューションを好む場合は、次を実行します。
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
ようになりMYID="$(mktemp -u)"
ます。あなたは、再起動するまで転がっ空の一時ファイルを持っている余裕ができた場合は、ドロップ-u
:MYID="$(mktemp)"
ran=`od -X -A n /dev/random | head -1 | cut -c3-38`
correlation_id=`echo ${ran} | cut -c1-8`-`echo ${ran} | cut -c10-13`-`echo ${ran} | cut -c14-17`-`echo ${ran} | cut -c19-22`-`echo ${ran} | cut -c23-26``echo ${ran} | cut -c28-35`
od -X -A n /dev/random | head -1 | cut -c3-38
あなたに与えます。この下のエコー$ X 4151540a 1f7d0bef 8a0725fb d26183a3 UUID = echo ${x} | cut -c1-8
- echo ${x} | cut -c10-13
- echo ${x} | cut -c14-17
- echo ${x} | cut -c19-22
- echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
$ UUID 4151540a-1f7d0bef-8a07-25fbd26183a3エコー
Java 10を使用している場合。
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
できる例を提供する必要があるということです。それは元の投稿で非常に明確です。
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
それをすることができますが、それはよりもずっと長いですuuidgen
。
uuid-runtime
明白な理由なしにパッケージに貼り付けます... +1します)