def hashing(typed=True, strict=False):
hashable_struct_producer = make_key if strict else make_key_hippie<EOL>def _make_key(*args, **kwargs):<EOL><INDENT>return hashable_struct_producer([list(args), kwargs], typed=typed)<EOL><DEDENT>return _make_key<EOL>
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).