Source code for unique_id

# Software License Agreement (BSD License)
#
# Copyright (C) 2012, Jack O'Quin
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#  * Neither the name of the author nor of other contributors may be
#    used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

"""
Python module for unique_id helper functions.

Various ROS components use universally unique identifiers
(UUID_). This module provides functions for working with a common
`uuid_msgs/UniqueID`_ message, and the standard Python
:class:`uuid.UUID` class.

Programmers are free to create UUID objects using any approved `RFC
4122`_ method. The standard Python :py:mod:`uuid` module supports them
all.

Functions in this module provide simple APIs, not requiring detailed
knowledge of `RFC 4122`_ or the :py:mod:`uuid` interface.  ROS
applications are likely to need either a random or a name-based UUID.

 * :func:`fromRandom` generates a random UUID.
 * :func:`fromURL` generates a name-based UUID from a URL string.

.. _`uuid_msgs/UniqueID`: http://ros.org/doc/api/uuid_msgs/html/msg/UniqueID.html
.. _`RFC 4122`: http://tools.ietf.org/html/rfc4122.html
.. _UUID: http://en.wikipedia.org/wiki/Uuid

"""

# enable some python3 compatibility options:
from __future__ import absolute_import, print_function, unicode_literals

from uuid_msgs.msg import UniqueID

import uuid

[docs]def fromMsg(msg): """Create UUID object from UniqueID message. :param msg: `uuid_msgs/UniqueID`_ message. :returns: :class:`uuid.UUID` object. """ return uuid.UUID(bytes = msg.uuid)
[docs]def fromRandom(): """Generate a random UUID object. :returns: type 4 :class:`uuid.UUID` object. Different calls to this function at any time or place will almost certainly generate different UUIDs. The method used is `RFC 4122`_ variant 4. """ return uuid.uuid4()
[docs]def fromURL(url): """Generate UUID from Uniform Resource Locator. :param url: URL for identifier creation. :returns: type 5 :class:`uuid.UUID` object. Matching *url* strings must yield the same UUID. Different *url* strings will almost certainly generate different UUIDs. The method used is `RFC 4122`_ variant 5, computing the SHA-1 hash of the *url*. For any given *url*, this function returns the same UUID as the corresponding C++ `unique_id::fromURL()` function. For example, Open Street Map identifiers are encoded like this, with decimal representations of the integer OSM node, way, or relation identifiers appended to the URL:: fromURL('http://openstreetmap.org/node/' + str(node_id)) fromURL('http://openstreetmap.org/way/' + str(way_id)) fromURL('http://openstreetmap.org/relation/' + str(rel_id)) """ return uuid.uuid5(uuid.NAMESPACE_URL, url)
[docs]def fromTime(timestamp, hw_addr): """Generate a Time Based UUID object. :param timestamp: The rospy.Time timestamp for UUID generation :param hw_addr: A 48-bit long representing the network address :returns: type 1 :class:`uuid.UUID` object Different calls to this function at any time or place will almost certainly generate different UUIDs. The method used is RFC 4122 version 1. """ uu = uuid.uuid1(hw_addr) offset = 122192928000000000 nano_epoch = long(timestamp.secs / (100 * 1e-9) + timestamp.nsecs / 100) # return nano_epoch nano_rfc = nano_epoch + offset data = (nano_rfc & 0x0000000FFFFFFFF, (nano_rfc >> 32) & 0x000FFFF, (nano_rfc >> 48) | 0x1000, uu.fields[3], uu.fields[4], uu.fields[5]) return uuid.UUID(fields=data)
[docs]def toMsg(uuid_obj): """Create a UniqueID message from a UUID object. :param uuid_obj: standard Python :class:`uuid.UUID` object. :returns: `uuid_msgs/UniqueID`_ message. """ return UniqueID(uuid = uuid_obj.bytes)
[docs]def toHexString(msg): """Get the canonical hexadecimal string representation for a UniqueID message. :param msg: `uuid_msgs/UniqueID`_ message. :returns: UUID hex string: '01234567-89ab-cdef-0123-456789abcdef'. A :class:`uuid.UUID` object yields the same representation via the :py:func:`str` function. """ return str(fromMsg(msg))