6

I want to create random unique numbers (UUIDs) as the following

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

First I tried this

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

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

What is the right way to create the following (where f is any number)?

ffffffff-ffff-ffff-ffff-ffffffffffff
  • 4
    Random numbers are not necessarily unique. – JdeBP Feb 14 at 9:39
  • yes , seems , this number is from presto configuration ( prestodb.github.io/docs/current/installation/deployment.html ) – yael Feb 14 at 9:41
  • 10
    Note that UUIDs are not just random numbers stringed together. – Kusalananda Feb 14 at 9:44
  • 9
    I've spent too many hours debugging scripts which assume "unlikely" is the same as "won't happen". If this is supposed to be a UUID then please do use an actual UUID, there are strict constraints on the way they are generated. If you could elaborate the reason you need this we might be able to help more. – Philip Couling Feb 14 at 9:51
27

On Linux, the util-linux/util-linux-ng package offers a command to generate UUIDs: uuidgen.

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

To quote the manual:

The uuidgen program creates (and prints) a new universally unique identifier (UUID) using the libuuid(3) library. The new UUID can reasonably be considered unique among all UUIDs created on the local system, and among UUIDs created on other systems in the past and in the future.

There are two types of UUIDs which uuidgen can generate: time-based UUIDs and random-based UUIDs. By default uuidgen will generate a random-based UUID if a high-quality random number generator is present. Otherwise, it will choose a time-based UUID. It is possible to force the generation of one of these two UUID types by using the -r or -t options.

Addendum: The OP had provided a link in the comments to the documentation for Presto DB. After a bit of searching, I found this related discussion where it is explicitly mentioned that the node.id property is indeed a UUID.


Adding the information provided by frostschutz in a comment:

As an alternative to the uuidgen/libuuid approach, you can make use of an interface exposed by the Linux kernel itself to generate UUIDs:

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

The UUID is re-generated on each request.

  • 2
    The final touch would be printf 'node.id=%s\n' "$( uuidgen )" – Kusalananda Feb 14 at 10:28
  • well done , this is very good answer – yael Feb 14 at 10:55
  • 15
    possible fallback if uuidgen is unavailable: cat /proc/sys/kernel/random/uuid – frostschutz Feb 14 at 10:59
  • 2
    @frostschutz that's much better -- that should've been the answer – mosvy Feb 14 at 13:05
  • @frostschutz I have added the information on this kernel interface to my answer. Thank you. – Haxiel Feb 14 at 13:32
-4

IIUC, that will do what you want:

$ rndnum=$RANDOM-$RANDOM-$RANDOM-$RANDOM-$RANDOM
$ echo $rndnum

EDIT you can use shuf to create random string composed of substrings of predefined length:

$ rndnum=$(shuf -i 11111111-99999999 -n 1)-$(shuf -i 1111-9999 -n 1)-$(shuf -i 1111-9999 -n 1)-$(shuf -i 1111-9999 -n 1)-$(shuf -i 111111111111-999999999999 -n 1)
$ echo $rndnum
59053328-6621-4406-7679-910171932338
  • Does this comply with the length of the OP's requirement. AFAIK, the length varies between -. The behavior of $RANDOM in your case would not be predictable ( I did not downvote FYI ) – Inian Feb 14 at 9:42
  • No, it does not, thanks for noticing that. – Arkadiusz Drabczyk Feb 14 at 9:45
  • I understand the OP tried to use $RANDOM but you should never use it for creating unique numbers. – Philip Couling Feb 14 at 10:02
  • I've just answered OP's question. – Arkadiusz Drabczyk Feb 14 at 10:03
  • 6
    The OP asked for unique random numbers. – Philip Couling Feb 14 at 10:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.