44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
# Licensed under the Mozilla Public Licence 2.0.
|
|
# https://www.mozilla.org/en-US/MPL/2.0
|
|
|
|
import uuid
|
|
import base64
|
|
|
|
def encode(uuid_):
|
|
"""
|
|
Returns the given uuid.UUID object as a 22 character slug. This can be a
|
|
regular v4 slug or a "nice" slug.
|
|
"""
|
|
return base64.urlsafe_b64encode(uuid_.bytes)[:-2] # Drop '==' padding
|
|
|
|
|
|
def decode(slug):
|
|
"""
|
|
Returns the uuid.UUID object represented by the given v4 or "nice" slug
|
|
"""
|
|
return uuid.UUID(bytes=base64.urlsafe_b64decode(slug + '==')) # b64 padding
|
|
|
|
|
|
def v4():
|
|
"""
|
|
Returns a randomly generated uuid v4 compliant slug
|
|
"""
|
|
return base64.urlsafe_b64encode(uuid.uuid4().bytes)[:-2] # Drop '==' padding
|
|
|
|
|
|
def nice():
|
|
"""
|
|
Returns a randomly generated uuid v4 compliant slug which conforms to a set
|
|
of "nice" properties, at the cost of some entropy. Currently this means one
|
|
extra fixed bit (the first bit of the uuid is set to 0) which guarantees the
|
|
slug will begin with [A-Za-f]. For example such slugs don't require special
|
|
handling when used as command line parameters (whereas non-nice slugs may
|
|
start with `-` which can confuse command line tools).
|
|
|
|
Potentially other "nice" properties may be added in future to further
|
|
restrict the range of potential uuids that may be generated.
|
|
"""
|
|
rawBytes = uuid.uuid4().bytes
|
|
rawBytes = chr(ord(rawBytes[0]) & 0x7f) + rawBytes[1:] # Ensure slug starts with [A-Za-f]
|
|
return base64.urlsafe_b64encode(rawBytes)[:-2] # Drop '==' padding
|