Source code for triad.utils.hash
from __future__ import absolute_import
import uuid
from typing import Any, Iterable
[docs]def to_uuid(*args: Any) -> str:
"""Determine the uuid by input arguments. It will search the input recursively.
If an object contains `__uuid__` method, it will call that method to get the uuid
for that object.
.. admonition:: Examples
.. code-block:: python
to_uuid([1,2,3])
to_uuid(1,2,3)
to_uuid(dict(a=1,b="z"))
:param args: arbitrary input
:return: uuid string
"""
s = str(uuid.uuid5(uuid.NAMESPACE_DNS, ""))
for a in args:
for x in _get_strs(a):
s = str(uuid.uuid5(uuid.NAMESPACE_DNS, s + x))
return s
def _get_strs(obj: Any) -> Iterable[str]:
if obj is None:
yield ""
elif isinstance(obj, object) and hasattr(obj, "__uuid__"):
yield str(obj.__uuid__()) # type: ignore
elif isinstance(obj, dict):
for k, v in obj.items():
for x in _get_strs(k):
yield x
for x in _get_strs(v):
yield x
elif not isinstance(obj, str) and isinstance(obj, Iterable):
for k in obj:
for x in _get_strs(k):
yield x
else:
yield str(type(obj))
yield str(obj)