| slugid.py - Compressed UUIDs for python |
| ======================================= |
| |
| .. image:: https://tools.taskcluster.net/lib/assets/taskcluster-120.png |
| |
| |Build Status| |Coverage Status| |License| |pypi Version| |Downloads| |
| |
| A python module for generating v4 UUIDs and encoding them into 22 character |
| URL-safe base64 slug representation (see `RFC 4648 sec. 5`_). |
| |
| Slugs are url-safe base64 encoded v4 uuids, stripped of base64 ``=`` padding. |
| |
| There are two methods for generating slugs - ``slugid.v4()`` and |
| ``slugid.nice()``. |
| |
| - The ``slugid.v4()`` method returns a slug from a randomly generated v4 uuid. |
| - The ``slugid.nice()`` method returns a v4 slug which conforms to a set of |
| "nice" properties. At the moment the only "nice" property is that the slug |
| starts with ``[A-Za-f]``, which in turn implies that the first (most |
| significant) bit of its associated uuid is set to 0. |
| |
| The purpose of the ``slugid.nice()`` method is to support having slugids which |
| can be used in more contexts safely. Regular slugids can safely be used in |
| urls, and for example in AMQP routing keys. However, slugs beginning with ``-`` |
| may cause problems when used as command line parameters. |
| |
| In contrast, slugids generated by the ``slugid.nice()`` method can safely be |
| used as command line parameters. This comes at a cost to entropy (121 bits vs |
| 122 bits for regular v4 slugs). |
| |
| Slug consumers should consider carefully which of these two slug generation |
| methods to call. Is it more important to have maximum entropy, or to have |
| slugids that do not need special treatment when used as command line |
| parameters? This is especially important if you are providing a service which |
| supplies slugs to unexpecting tool developers downstream, who may not realise |
| the risks of using your regular v4 slugs as command line parameters, especially |
| since this would arise only as an intermittent issue (one time in 64). |
| |
| Generated slugs take the form ``[A-Za-z0-9_-]{22}``, or more precisely: |
| |
| - ``slugid.v4()`` slugs conform to |
| ``[A-Za-z0-9_-]{8}[Q-T][A-Za-z0-9_-][CGKOSWaeimquy26-][A-Za-z0-9_-]{10}[AQgw]`` |
| |
| - ``slugid.nice()`` slugs conform to |
| ``[A-Za-f][A-Za-z0-9_-]{7}[Q-T][A-Za-z0-9_-][CGKOSWaeimquy26-][A-Za-z0-9_-]{10}[AQgw]`` |
| |
| RFC 4122 defines the setting of 6 bits of the v4 UUID which implies v4 slugs |
| provide 128 - 6 = 122 bits entropy. Due to the (un)setting of the first bit |
| of "nice" slugs, nice slugs provide therefore 121 bits entropy. |
| |
| |
| Usage |
| ----- |
| |
| .. code-block:: python |
| |
| import slugid |
| |
| # Generate "nice" URL-safe base64 encoded UUID version 4 (random) |
| slug = slugid.nice() # a8_YezW8T7e1jLxG7evy-A |
| |
| # Alternative, if slugs will not be used as command line parameters |
| slug = slugid.v4() # -9OpXaCORAaFh4sJRk7PUA |
| |
| # Get python uuid.UUID object |
| uuid = slugid.decode(slug) |
| |
| # Compress to slug again |
| assert(slug == slugid.encode(uuid)) |
| |
| |
| RNG Characteristics |
| ------------------- |
| UUID generation is performed by the built-in python `uuid library`_ which does |
| not document its randomness, but falls back to system uuid-generation libraries |
| where available, then urandom, then random. Therefore generated slugids match |
| these rng characteristics. |
| |
| License |
| ------- |
| The ``slugid`` library is released on the MPL 2.0 license, see the ``LICENSE`` |
| for complete license. |
| |
| Testing |
| ------- |
| |
| .. code-block:: bash |
| |
| pip install -r requirements.txt |
| tox |
| |
| Publishing |
| ---------- |
| To republish this library to pypi.python.org, update the version number in |
| ``slugid/__init__.py``, commit it, push to github, and then run: |
| |
| .. code-block:: bash |
| |
| # delete stale versions |
| rm -rf dist |
| |
| # build source package |
| python setup.py sdist |
| |
| # publish it |
| twine upload -s dist/* |
| |
| |
| .. _RFC 4648 sec. 5: http://tools.ietf.org/html/rfc4648#section-5 |
| .. _uuid library: https://docs.python.org/2/library/uuid.html |
| |
| .. |Build Status| image:: https://travis-ci.org/taskcluster/slugid.py.svg?branch=master |
| :target: http://travis-ci.org/taskcluster/slugid.py |
| .. |Coverage Status| image:: https://coveralls.io/repos/taskcluster/slugid.py/badge.svg?branch=master&service=github |
| :target: https://coveralls.io/github/taskcluster/slugid.py?branch=master |
| .. |License| image:: https://img.shields.io/badge/license-MPL%202.0-orange.svg |
| :target: https://github.com/taskcluster/slugid.py/blob/master/LICENSE |
| .. |pypi Version| image:: https://img.shields.io/pypi/v/slugid.svg |
| :target: https://pypi.python.org/pypi/slugid |
| .. |Downloads| image:: https://img.shields.io/pypi/dm/slugid.svg |
| :target: https://pypi.python.org/pypi/slugid |