जवाबों:
uuidgen
प्रोग्राम देखें जो e2fsprogs पैकेज का हिस्सा है ।
के अनुसार इस , libuuid
अब का हिस्सा है util-linux और e2fsprogs में शामिल किए जाने लिया जा रहा है। हालाँकि, नए उबंटू सिस्टम पर, uuidgen
अब uuid-runtime
पैकेज में है।
एक यूआईडी बनाने और उसे एक चर में सहेजने के लिए:
uuid=$(uuidgen)
मेरे उबंटू सिस्टम पर, अल्फा अक्षर लोअर केस के रूप में आउटपुट होते हैं और मेरे ओएस एक्स सिस्टम पर, वे ऊपरी केस के रूप में आउटपुट होते हैं (एक टिप्पणी में इसे इंगित करने के लिए डेविड का धन्यवाद)।
सभी ऊपरी मामले पर स्विच करने के लिए (ऊपर के रूप में उत्पन्न करने के बाद):
uuid=${uuid^^}
सभी निचले मामलों पर स्विच करने के लिए:
uuid=${uuid,,}
यदि, उदाहरण के लिए, आपके पास दो UUID हैं और आप उनकी तुलना Bash में करना चाहते हैं, तो उनके मामले को अनदेखा करते हुए, आप tolower()
इस तरह से एक शैली तुलना कर सकते हैं :
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
दोनों लाइनों के आउटपुट) का प्रतिनिधित्व करता है । अगर यह आपके लिए मायने रखता है और आपके पास बैश 4 है, तो आप इसे कम केस बनाने के लिए कर सकते हैं: uuid=$(uuidgen); uuid=${uuid,,}
या इसे ऊपरी मामला बनाने के लिए: uuid=$(uuidgen); uuid=${uuid^^}
या tolower()
स्टाइल टेस्ट करने के लिए इन पंक्तियों के साथ कुछ करें :if [[ ${uuid1,,} == ${uuid2,,} ]]
बाहरी निर्भरता को जोड़े बिना विविधता जोड़ने के लिए, लिनक्स पर आप कर सकते हैं:
UUID=$(cat /proc/sys/kernel/random/uuid)
लाइनबीएस संगतता परत (लाइनक्सुलेटर?) के तहत फ्रीबीएसडी पर खराब प्रथाओं का प्रचार करने के लिए ?
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
संदर्भ:
बस पूर्णता के लिए ... dbus
डेबियन पर पैकेज के साथ स्थापित एक यूयूआईडी जनरेटर भी है । मैं इसे पहले के आसपास देख याद किया। यह शायद e2fsprogs पैकेज के समान एल्गोरिथ्म है, लेकिन यह डैश को जोड़ता नहीं है, इसलिए यह इसके लिए थोड़ा सा धुआं हो सकता है:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
ग्रैविटी एक सुरक्षा टिप जोड़ता है: "DBus UUIDs RFC 4122 के साथ संबंधित या संगत नहीं हैं । इसके अलावा, dbus-uuidgen हमेशा यूनिक्स टाइमस्टैम्प का उपयोग अंतिम 4 बाइट्स के रूप में करता है। इसलिए वे कुछ उपयोगों के लिए अनुपयुक्त हो सकते हैं।" (धन्यवाद, विशालता, मुझे मैनपॉट में देखा जाना चाहिए था।)
dbus-uuidgen
हमेशा अंतिम 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
विवरण को समाप्त करने के लिए एक संस्करण दिखाया गया है । यह कोड को बहुत अधिक निर्वस्त्र बनाता है। ध्यान दें कि दोनों B%15
होना चाहिए B%16
और B%255
होना चाहिए B%256
।
source <(curl url)
या जो भी प्रयास करें
मुझे यह स्क्रिप्ट "वन-लाइनर" उपयोगी लगी है, जहां uuidgen उपलब्ध नहीं है। यह पर्ल या पायथन के लिए बाहरी मॉड्यूल स्थापित करने के लिए किसी भी तरह की नग्नता को भी नजरअंदाज करता है।
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
स्नो लेपर्ड, रेड हैट वल्लाह, सोलारिस 9 4/04 और नए सफलतापूर्वक परीक्षण किए गए। मैं उत्सुक हूँ अगर यह गैर-विशिष्टता के लिए प्रवण है, लेकिन मुझे पिछले 10 वर्षों में 'बिटकॉइन' नहीं किया गया है। बेशक, head -1
इसे head -_other-value_ | tail -1
भी बदला जा सकता है।
समझाना,
/dev/random
और /dev/urandom
कर्नेल यादृच्छिक जनरेटर हैं।
od
(ऑक्टल डंप) में एक हेक्स आउटपुट स्विच (-x) है जो प्रति पंक्ति 16 बाइट्स का उत्पादन करता है।
head
-एन [| पूंछ -1] (जहां n> 0) पिछले आउटपुट की सिर्फ एक पंक्ति निकालता है।
awk
OutputFieldSeparator को हर जगह एक हाइफ़न सेट करने के लिए सेट किया जाता है जो प्रिंट स्टेटमेंट में होता है। फ़ील्ड्स को स्वतंत्र रूप से 2-9 निर्दिष्ट करके, हम हाइफ़न को नियंत्रित करते हैं और इंडेक्स / ऑफ़सेट काउंटर को स्ट्रिप करते हैं जो आउटपुट के प्रत्येक लाइन को 'ओडी' उपसर्ग करता है।
परिणाम 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()')
उत्पन्न होने वाले UUIDS के प्रकारों के लिए पायथन डॉक्यूमेंटेशन UUID देखें ।
गैर-सिस्टमड मशीन पर एक सिस्टम-मशीन-आईडी संगत फ़ाइल उत्पन्न करने के लिए, आप इसे करने के लिए अजगर का उपयोग कर सकते हैं:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
Python3 के लिए उपयोग करें
पर्ल e2fsprogs
पैकेज के आधार पर एक यूयूआईडी लाइब्रेरी प्रदान करता है । मेरे डेबियन सिस्टम पर यह 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
apt-get install uuid
मेरे लिए काम किया, फिर मैं चला uuid
मैंने थोक में UUIDs की एक मनमानी संख्या उत्पन्न करने के लिए पायथन का उपयोग करके थोड़ा बैश फ़ंक्शन लिखा:
# 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 यूयूआईडी को संभालता है , जो कि मेरे स्थापित (जैसे e2fsprogs) पुस्तकालय को संभाल सकता है से परे था। सौभाग्य से, ओपनएसयूएसई के पास मुख्य रिपोस में से एक में है। W / Windows (जैसे Cygwin) या MySQL काम करने के लिए एक संस्करण प्राप्त करना एक असफलता रही है। ऐसा लगता है कि यह Linux / PostgreSQL / Python पर स्विच करने का समय है (और मुझे MySQL / MariaDB को SQLyog GUI बहुत पसंद है) क्योंकि मुझे वास्तव में v3 और v5 UUIDs की आवश्यकता है।
-v3 ns:URL custom-data
सीडिंग मैकेनिज्म के जरिए नेमस्पेसिंग का भी समर्थन करता है।
मुझे यकीन है कि कुछ लोग यहां पहुंचेंगे, और बस अपनी स्क्रिप्ट में उपयोग के लिए एक अद्वितीय आईडी बनाने के लिए एक आसान तरीका ढूंढ रहे हैं, और इसे एक सच्चे यूयूआईडी होने की आवश्यकता नहीं है।
यदि ऐसा है, तो आप केवल निम्नलिखित कार्य कर सकते हैं, जो एक आईडी उत्पन्न करेगा जो कि दूसरे के लिए अद्वितीय है - इसलिए यदि आप इसे एक सेकेण्ड के भीतर कई बार चलाते हैं, तो भी आपको वही परिणाम मिलेगा।
MYID="U$(date +%s)"
echo $MYID
वर्तमान सिस्टम समय के आधार पर निम्नलिखित की तरह आईडी उत्पन्न करेगा:
U1454423662
नोट: यदि आप लिनक्स पर हैं, या एक मैक पर Coreutils स्थापित है, तो आप नैनोसेकंड के लिए एक अद्वितीय आईडी बनाने के लिए निम्नलिखित का उपयोग कर सकते हैं:
MYID="U$(date +%s%N)"
echo $MYID
या यदि आप नैनोसेकंड के नीचे एक अजगर आधारित समाधान पसंद करते हैं, जो लगभग हर जगह काम करना चाहिए, तो चलाएं:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
रूप में नहीं होगा MYID="$(mktemp -u)"
। यदि आप रिबूट होने तक खाली पड़ी फाइलों को रखना चाहते हैं, तो ड्रॉप करें -u
:MYID="$(mktemp)"
यह धागा, इसके विविध उदाहरण हैं, वास्तव में मेरे लिए उपयोगी थे। मुझे अक्सर विभिन्न वातावरणों से uuid कार्यों की आवश्यकता होती है। और जब मैं शुद्ध बैश उदाहरणों से प्यार करता हूं, तो एक अलग भाषा से पुस्तकालय का उपयोग करना कभी-कभी अधिक सुविधाजनक होता है।
तो बस पूरी तरह से, रूबी (1.9.3+) में बिल्ट-इन सिक्योर रैंडम मॉड्यूल है जिसमें कई उपयोगी हैश और आईडी फ़ंक्शन हैं। बैश क्ली से, आप यह कर सकते हैं।
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
आपको यह नीचे दिया गया है इको $ 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-1be7d-0bef-8a07-25fb26183a3
यदि आप 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 आप तक)