Returns a typed and/or strict key callable.

    A strict key callable will fail on traditionaly non-hashable object,
    while a strict=False hashing will use hippie hashing that can hash
    mutable object.

    A typed key callable will use type of each object in the hash and will
    distinguish with same hash but different type (example: 2 and 2.0).

def hashing(typed=True, strict=False):
    """Returns a typed and/or strict key callable.

    A strict key callable will fail on traditionaly non-hashable object,
    while a strict=False hashing will use hippie hashing that can hash
    mutable object.

    A typed key callable will use type of each object in the hash and will
    distinguish with same hash but different type (example: 2 and 2.0).

    """
    hashable_struct_producer = make_key if strict else make_key_hippie

    def _make_key(*args, **kwargs):
        ## use a list to avoid using hash of tuples...
        return hashable_struct_producer([list(args), kwargs], typed=typed)
    return _make_key