คำตอบ:
ดูuuidgen
โปรแกรมที่เป็นส่วนหนึ่งของแพ็คเกจe2fsprogs
ตามนี้ , libuuid
ตอนนี้เป็นส่วนหนึ่งของutil ลินุกซ์และรวมอยู่ใน e2fsprogs จะถูกแบ่งออก อย่างไรก็ตามในระบบ Ubuntu ใหม่uuidgen
ตอนนี้อยู่ในuuid-runtime
แพ็คเกจ
ในการสร้าง uuid และบันทึกไว้ในตัวแปร:
uuid=$(uuidgen)
ในระบบ Ubuntu ของฉันตัวอักษรอัลฟาจะถูกส่งออกเป็นตัวพิมพ์เล็กและบนระบบ OS X ของฉันมันจะถูกส่งออกเป็นตัวพิมพ์ใหญ่ (ขอบคุณ David ที่ชี้ให้เห็นสิ่งนี้ในความคิดเห็น)
หากต้องการเปลี่ยนเป็นตัวพิมพ์ใหญ่ทั้งหมด (หลังจากสร้างตามด้านบน):
uuid=${uuid^^}
วิธีเปลี่ยนเป็นตัวพิมพ์เล็กทั้งหมด:
uuid=${uuid,,}
ตัวอย่างเช่นถ้าคุณมี 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)
อ้างอิง:
เพียงเพื่อความสมบูรณ์ ... นอกจากนี้ยังมีตัวสร้าง UUID ที่ติดตั้งพร้อมกับdbus
แพ็คเกจบน Debian ฉันคิดถึงมันก่อนหน้านี้ อาจเป็นอัลกอริทึมเดียวกับแพคเกจ e2fsprogs แต่ไม่เพิ่มขีดกลางดังนั้นมันอาจจะสะอาดกว่าสำหรับคุณเล็กน้อย:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity เพิ่มเคล็ดลับความปลอดภัย: "DBus UUIDs ไม่เกี่ยวข้องหรือเข้ากันได้กับRFC 4122นอกจากนี้dbus-uuidgenมักใช้ Unix timestamp เป็น 4 ไบต์สุดท้ายดังนั้นจึงอาจไม่เหมาะสมสำหรับการใช้งานบางอย่าง" (ขอบคุณ Grawity ฉันควรจะเห็นสิ่งนั้นใน manpage)
dbus-uuidgen
ใช้การประทับเวลา Unix เป็น 4 ไบต์สุดท้ายเสมอ ดังนั้นจึงอาจไม่เหมาะสมสำหรับการใช้งานบางอย่าง
หากคุณไม่ต้องการพึ่งพาไฟล์ปฏิบัติการอื่นหรือไม่สามารถใช้งานได้นี่คือเวอร์ชั่นทุบตีแท้จากที่นี่ :
# 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
ในการกำจัดif
คำสั่งรวมถึงfor
คำสั่งด้านใน มันทำให้รหัส neater มาก โปรดทราบว่าทั้งสอง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 และใหม่กว่าได้สำเร็จ ฉันสงสัยว่าสิ่งนี้มีแนวโน้มที่จะไม่ใช่ลักษณะเฉพาะ แต่ฉันไม่ได้ 'bit'ten ในช่วง 10 ปีที่ผ่านมา แน่นอนhead -1
สามารถถูกแทนที่ด้วยhead -_other-value_ | tail -1
เช่นกัน
อธิบาย,
/dev/random
และ/dev/urandom
เป็นเครื่องกำเนิดไฟฟ้าแบบสุ่มของเคอร์เนล
od
(ดัมพ์ฐานแปด) มีสวิตช์เอาต์พุตฐานสิบหก (-x) ที่สร้าง 16 ไบต์ต่อบรรทัด
head
-n [| tail -1] (โดยที่ n> 0) แยกเพียงหนึ่งบรรทัดของเอาต์พุตก่อนหน้า
awk
ตั้ง 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 -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
วิธีใช้ในเชลล์:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
ดูPython Documentation UUIDสำหรับประเภทของ UUIDS ที่สามารถสร้างได้
ในการสร้างไฟล์ที่เข้ากันได้กับ systemd machine-id บนเครื่องที่ไม่ใช่ systemd คุณสามารถใช้ 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 ให้ห้องสมุด UUID ตามe2fsprogs
แพคเกจ ในระบบ 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
นี่จะเป็นเรื่องเล็กน้อยที่จะเพิ่มลงใน shellscript พร้อม backticks หรือ$()
notation:
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
apt-get install uuid
ทำงานให้ฉันแล้วฉันก็วิ่ง uuid
ฉันเขียนฟังก์ชัน Bash เล็กน้อยโดยใช้ Python เพื่อสร้างจำนวน UUID จำนวนมากโดยพลการ:
# 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) มันจัดการเวอร์ชั่น UUIDs เวอร์ชัน 3 และ 5 ได้อย่างเหมาะสมซึ่งเกินกว่าที่ห้องสมุดของฉัน (เช่น e2fsprogs) ติดตั้งไว้จะสามารถจัดการได้ โชคดีที่ openSUSE มีหนึ่งใน repos หลัก การทำให้รุ่นทำงานโดยใช้ Windows (เช่น Cygwin) หรือ MySQL นั้นล้มเหลว ดูเหมือนว่าถึงเวลาเปลี่ยนเป็น Linux / PostgreSQL / Python (และฉันชอบ SQLyog GUI เป็น MySQL / MariaDB) เนื่องจากฉันต้องการ v3 และ v5 UUID จริงๆ
-v3 ns:URL custom-data
กลไกการสร้าง
ฉันแน่ใจว่าบางคนจะมาถึงที่นี่และกำลังมองหาวิธีที่ง่ายในการสร้าง ID เฉพาะสำหรับใช้ในสคริปต์ของพวกเขาและไม่จำเป็นต้องเป็น UUID จริง
หากเป็นเช่นนั้นคุณสามารถทำสิ่งต่อไปนี้ซึ่งจะสร้างรหัสที่ไม่ซ้ำกันจนถึงวินาที - ดังนั้นหากคุณเรียกใช้หลาย ๆ ครั้งภายในไม่กี่วินาทีคุณจะยังได้รับผลลัพธ์เดียวกัน
MYID="U$(date +%s)"
echo $MYID
จะสร้างรหัสเช่นต่อไปนี้ตามเวลาปัจจุบันของระบบ:
U1454423662
หมายเหตุ: หากคุณใช้งานบน Linux หรือติดตั้ง Coreutils ไว้ในเครื่อง Mac คุณสามารถใช้สิ่งต่อไปนี้เพื่อสร้างรหัสเฉพาะให้กับนาโนวินาที:
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)"
หากคุณสามารถที่จะมีไฟล์ temp ที่ว่างเปล่าวางไว้รอบ ๆ จนกระทั่งรีบูตให้ปล่อย-u
:MYID="$(mktemp)"
หัวข้อนี้ด้วยตัวอย่างที่หลากหลายเป็นประโยชน์กับฉันจริงๆ ฉันต้องการฟังก์ชั่น uuid จากสภาพแวดล้อมที่แตกต่างกันจำนวนมาก และในขณะที่ฉันรักตัวอย่างทุบตีบริสุทธิ์บางครั้งก็สะดวกกว่าที่จะใช้ห้องสมุดจากภาษาอื่น
ดังนั้นเพื่อความทั่วถึง ruby (1.9.3+) มีโมดูล SecureRandom ในตัวที่มีฟังก์ชั่นแฮชและรหัสจำนวนมาก จาก bash cli คุณสามารถทำได้
ruby -r securerandom -e 'puts SecureRandom.uuid'
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
แสดง echo ด้านล่างนี้ $ 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
echo $ uuid 4151540a-1f7d-0bef-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 ให้คุณ)