# Path: ubelt/util_const.py
# class _NoParamType(object):
#     def __new__(cls):
#     def __reduce__(self):
#     def __copy__(self):
#     def __deepcopy__(self, memo):
#     def __str__(cls):
#     def __repr__(cls):
#     def __bool__(self):


import hashlib
import math
        import xxhash  # type: ignore
        import blake3  # type: ignore
        import numpy as np
        import uuid
                import ubelt as ub
                import ubelt as ub
        import torch
        import json
from collections import OrderedDict
from ubelt.util_const import NoParam
        if self._lazy_queue:  # nocover
            self._evaluate_registration_queue()
        return key in self.algos or key in self.aliases

    def _register_xxhash(self):  # nocover
        self.algos['xxh32'] = xxhash.xxh32
        self.algos['xxh64'] = xxhash.xxh64
        self.aliases.update({
            'xxhash': 'xxh32',
            'xx32': 'xxh32',
            'xx64': 'xxh64',
        })

    def _register_blake3(self):  # nocover
        self.algos['blake3'] = blake3.blake3
        self.aliases['b3'] = 'blake3'

    def _register_hashlib(self):
        guaranteed = set(hashlib.algorithms_guaranteed)
        for key in guaranteed:  # nocover
            self.algos[key] = getattr(hashlib, key)

        if 0:  # nocover
            # Do we want to expose these hash algos?
            available = set(hashlib.algorithms_available)
            extra = available - guaranteed
            for key in extra:
                self.algos[key] = hashlib.new(key)

    def lookup(self, hasher):

# Path: ubelt/util_const.py
# class _NoParamType(object):
#     def __new__(cls):
#     def __reduce__(self):
#     def __copy__(self):
#     def __deepcopy__(self, memo):
#     def __str__(cls):
#     def __repr__(cls):
#     def __bool__(self):


# Path: ubelt/util_hash.py
import hashlib
import math
        import xxhash  # type: ignore
        import blake3  # type: ignore
        import numpy as np
        import uuid
                import ubelt as ub
                import ubelt as ub
        import torch
        import json
from collections import OrderedDict
from ubelt.util_const import NoParam

        if self._lazy_queue:  # nocover
            self._evaluate_registration_queue()
        return key in self.algos or key in self.aliases

    def _register_xxhash(self):  # nocover
        self.algos['xxh32'] = xxhash.xxh32
        self.algos['xxh64'] = xxhash.xxh64
        self.aliases.update({
            'xxhash': 'xxh32',
            'xx32': 'xxh32',
            'xx64': 'xxh64',
        })

    def _register_blake3(self):  # nocover
        self.algos['blake3'] = blake3.blake3
        self.aliases['b3'] = 'blake3'

    def _register_hashlib(self):
        guaranteed = set(hashlib.algorithms_guaranteed)
        for key in guaranteed:  # nocover
            self.algos[key] = getattr(hashlib, key)

        if 0:  # nocover
            # Do we want to expose these hash algos?
            available = set(hashlib.algorithms_available)
            extra = available - guaranteed
            for key in extra:
                self.algos[key] = hashlib.new(key)

    def lookup(self, hasher):

        if hasher is NoParam or hasher == 'default':