"Unique": the UUID generator tool. unique.py
will generate UUIDs (using a CLI) in a variey of flavours whilst unique_gui.py
wraps this up in a pretty GUI. This project in availble as native python source, a windows executable and docker image.
Note: A Version 4 UUID is the default, safe and extremely random output of this tool.
- Generate UUID Versions 1, 3, 4, 5 and the "Special Nil Case"/0 (GUI 0/1/4 Only)
- Support for DNS (FWDN), URL, OID and X.500 Namespaces (
--ns
) - Prefix UUID with URN (RFC 4122) (
-u
) - Commandline Unix-Like tool and Graphical User Interface
- Non-Standard: Output UUID as Uppercase (
-U
) - Shorten UUIDs using Base64 Encoding (
-s
) - Platform Agnostic: Python, Docker & Windows
Back in May 2016, I needed a random number generator and started learning about UUIDs. This tool started as a way to automatically generate 20 v4 UUIDs (the only one not static or engineered to a set of hardware) and has now been updated and released to hopefully demonstrate my profeciency with git
, git-flow
, markdown
, python
, ui design, ux design, tkinter
, oosd, argument parsing, RegEx
, Base64
, Hexadecimal
, Docker, and more!
What is a UUID? (from Wikipedia)
A universally unique identifier (UUID) is a 128-bit number used to identify information in computer systems. UUIDs are, for practical purposes, unique. Their uniqueness does not depend on a central registration authority or coordination between the parties generating them. Anyone can create a UUID and use it to identify something with near certainty that the identifier does not duplicate one that has already been, or will be, created to identify something else.
Using the tkinter
library, a gui is available to generate UUIDs for those not comfortable with the command line. Simply open/execute python3 unique_gui.py
to be presented with the following graphical interface:
Windows | Linux | macOS | |
---|---|---|---|
Unique | |||
Menu | |||
Options | |||
About |
The following Menu options are availble:
- File
- New: Clear-down the UUIDs in the current tool, ready for new generation
- Open: Open a text (
.txt
/.uuid
) file, useful for appending UUIDs - Save: Save the current UUIDs to a text (
.txt
/.uuid
) file - Save As..: Save the current UUIDs to a new text (
.txt
/.uuid
) file - Quit
- Generate
- Version 1 UUID: Generare a Version 1 (Datetime & MAC Address) UUID
- Version 4 UUID: Generate a Version 4 UUID (based on RNG)
- Special Nil UUID: Generate a Nil UUID (0's)
- Tools
- Options: Open the Options popup
- Help
- About: Opens a popup window with author/version information
The following Keyboard Shortcuts are available:
- CTRL + N: Clear-down the UUIDs in the current tool,ready for new generation
- CTRL + O: Open a text (
.txt
/.uuid
) file,useful for appending UUIDs - CTRL + S: Save the current UUIDs to a text (
.txt``````.uuid
) file - CTRL + 0: Generate a Nil UUID (0's)
- CTRL + 1: Generare a Version 1 (Datetime & MAC Address)UUID
- CTRL + 4: Generate a Version 4 UUID (based on RNG)
- F1: Opens a popup window with author/version information
- F9: Open the Options popup
- ALT + F4: Exit/Quit
The following arguments are compatible with the respective UUID-version generation.
Version | Switch | Specifics | Additional Options (Bold = Mandatory) |
---|---|---|---|
0 / Nil | -v 0 | Special Nil UUID | -q, -u, -U, -s |
1 | -v 1 | Datetime and MAC address | -q, -u, -U, -s |
4 | -v 4 | Random Data | -q, -u, -U, -s |
3 | -v 3 | Namespace & Name-based | --ns, -n, -q, -u, -U, -s |
5 | -v 5 | Namespace & Name-based | --ns, -n, -q, -u, -U, -s |
The following code block uses shorthand arguments, the tool provides the facility to use both short (e.g. -q
) and long (e.g. --quantity
) arguments interchangebly. Windows can natively execute .py
files if Python is installed. If you are using the independant released exexutable; simply substitute the extensions in the following examples to .exe
.
# UUIDv4
>./unique.py
27fd1448-3c0d-4d73-94c4-9f16dd9e0c16
# 5 x UUIDv4
>./unique.py -q 5
32ec9ca1-2a84-40c9-afa4-f67a7a8c3156
039ee9f1-c5a0-4d85-805a-89b84974a6c7
b6a4587d-a3de-4e4c-8d84-a3fad6b14192
91bd7bf0-8b6e-46af-ad01-7f91ca66aa25
4085c90e-b195-40fb-b31e-e5faf76eb34a
# 2 x UUIDv1 with URN prefix
>./unique.py -v 1 -q 2 -u
urn:uuid:7ed04b31-f14c-11ea-ac52-e4b31802edf0
urn:uuid:7ed0c3d9-f14c-11ea-aabd-e4b31802edf0
# Special Nil UUID
>./unique.py -q 1 -v 0
00000000-0000-0000-0000-000000000000
# UUIDv5 for "python.org" Fully qualified domain name
>./unique.py -v 5 --ns dns -n "python.org"
886313e1-3b8a-5372-9b90-0c9aee199e5d
# Uppercase UUIDv3 for "http://adambonner.co.uk" URL with URN prefix
>./unique.py -U -v 3 -n "http://adambonner.co.uk" --ns url -u
urn:uuid:1FDC56DF-BB86-3F0D-9356-8612ABA227FF
# UUIDv4
$ python3 unique.py
31c2c13c-60c9-4883-8f12-16ede5022da4
# 3x UUIDv1 encoded as Base64
$ python3 unique.py -v 1 -q 3 --short
EHuMMPxlEeqNuc2jzUq+xw==
EHuMMfxlEeqNuc2jzUq+xw==
EHuMMvxlEeqNuc2jzUq+xw==
Using the -h
(--help
) argument on either Windows or Linux displays the following information:
usage: unique.py [-h] [-v <VERSION>] [-q <QUANTITY>] [--ns <NAMESPACE>] [-n <NAME>] [-u | -U | -s]
Generate a number of version specific UUIDs.
optional arguments:
-h, --help show this help message and exit
-v <VERSION>, --version <VERSION>
Specify output UUID version (0, 1, 3, 4, or 5)
-q <QUANTITY>, --quantity <QUANTITY>
Specify output quanitity (1 - 65536)
--ns <NAMESPACE>, --namespace <NAMESPACE>
UUID v3 or v5 namespace
-n <NAME>, --name <NAME>
Specify UUID v3 or v4 name
-u, --urn Specify URN standard prefix
-U, --uppercase Non-standard uppercase UUID string
-s, --short Shortened UUID using Base64 Encoding
The project's Dockerfile can be utilised to create a platform independant container image; supporting the generation of UUIDs in cloud (e.g. Kubernetes/OpenShift) environments. Getting unique
to work with docker requires two steps, first create the docker image, then run it in the docker service
#Use Docker to Build Image, you may need elevated privilages/"root"
$ docker build . -t uuid
# UUIDv4
$ docker run --rm -it uuid:latest
# 5 x UUIDv4
$ docker run --rm -it uuid:latest -q 5
32ec9ca1-2a84-40c9-afa4-f67a7a8c3156
039ee9f1-c5a0-4d85-805a-89b84974a6c7
b6a4587d-a3de-4e4c-8d84-a3fad6b14192
91bd7bf0-8b6e-46af-ad01-7f91ca66aa25
4085c90e-b195-40fb-b31e-e5faf76eb34a
# Display Help
$ docker run --rm -it uuid:latest --help
Note: The Docker (CLI-only) version of this project is inherently platform independant. This readme doesn't discuss that technology. Get started here.
Unique
is build with utilising the following Python 3 libraries:
uuid
codecs
re
argparse
tk
/tkinter
(including:messagebox
,simpledialog
,filedialog
)logging
pyinstaller
To utilise unique
on multiple platforms Python 3 is required.
Windows:
# Install Python3 using Chocolatey
choco install python -y
# Restart Windows Terminal / PowerShell
echo "close this window"
# Use pip to Install PyInstaller
pip install pyinstaller
Linux:
# Install Python 3
sudo apt-get install python3
# Install tkinter
sudo apt-get install python3-tk
The following software was used to create this project:
- Graphics and Images created with: Paint.net
- Microsoft Visual Studio Image Library
- Windows Icon (
.ico
) file created with: IcoFX Portable (1.6.4 Rev 3) - IDE: Microsoft Visual Studio Code
The following project icon was created with paint.net. Using a screenshot of Powershell executing the creation of 20 Version 1 UUIDs. 4 image resolutions where then produced and compiled into the single compressed .ico
format.
256x256 | 48x48 | 32x32 | 16x16 |
The following are known limitations and probably wont get fixed. Feel free to raise a pull request if you can help:
- Limited to the 4 predefined UUID v3/v5 namespaces (URL, DNS, OID, X.500)
- Unicode support is untested
Thanks to these great projects I was able to figure out how to use tkinter for the GUI.
Unique
is a hobby project with no guarantees. I've been thinking about adding the following functionaity somewhere down the line though!:
CLI:
Support for more than UUIDv4CLI:
Make code more Unix-like (no boilerplate on execution)CLI:
Parameterise the number of returned UUIDsCLI:
Special Nil UUIDCLI:
Support for standard UUID URN prefixCLI:
Support for non-standard uppercase UUIDCLI:
Auto-generated helpRedo the IconCLI:
Adding support for uuid namespaces, enabling UUIDv3 and UUIDv5Dockerise the commandline toolGUI: Add a Graphical User InterfaceGUI: Utilise a tools/options panel/frame/windowGUI: Enable File: New/Open/Save/Save As.../Exit in the GUIGUI: Add Iconography to the Menu BarGUI: Enable Keyboard Shortcuts in the GUI- GUI: Highlight Current Line
- GUI: Highlight Regex Version
- GUI: Add (floating?) File Information Pane
- GUI: Add UUIDv3 and UUIDv5
- GUI: Dark Mode
- GUI: Dockerise the GUI (as Web Application?)
CLI:
Encode UUIDs in Base64 to reduce character lengthCLI:
Decode Base64 encoded UUIDCLI:
Reverse-Engineer UUID: VersionCLI:
Reverse-Engineer UUID: Date/TimeCLI:
Reverse-Engineer UUID: MAC Address- GUI: Encode UUIDs in Base64 to reduce character length
- GUI: Decode Base64 encoded UUID
- GUI: Reverse-Engineer UUID: Version
- GUI: Reverse-Engineer UUID: Date/Time
- GUI: Reverse-Engineer UUID: MAC Address
- Creating a Windows Installer