酸洗过程是否具有确定性?

Ale*_*ega 8 python memoization pickle

Pickle是否总是为某个输入值产生相同的输出?我想当酸洗词典具有相同的内容但插入/删除历史记录不同时,可能会出现问题.我的目标是使用Pickle和SHA1为memoize实现创建函数参数的"签名".

Mil*_*les 8

我想当酸洗词典具有相同的内容但插入/删除历史记录不同时,可能会出现问题.

对:

>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False
Run Code Online (Sandbox Code Playgroud)

另请参见:pickle.dumps不适合散列

我的目标是使用Pickle和SHA1为memoize实现创建函数参数的"签名".

这有很多基本问题.不可能想出一个正确映射相等性的对象到字符串转换 - 想一想对象标识的问题:

>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True
Run Code Online (Sandbox Code Playgroud)

根据您的具体要求,您可以将对象层次结构转换为可以随后哈希的层次结构:

def hashablize(obj):
    """Convert a container hierarchy into one that can be hashed.

    Don't use this with recursive structures!
    Also, this won't be useful if you pass dictionaries with
    keys that don't have a total order.
    Actually, maybe you're best off not using this function at all."""
    try:
        hash(obj)
    except TypeError:
        if isinstance(obj, dict):
            return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems()))
        elif hasattr(obj, '__iter__'):
            return tuple(hashablize(o) for o in obj)
        else:
            raise TypeError("Can't hashablize object of type %r" % type(obj))
    else:
        return obj
Run Code Online (Sandbox Code Playgroud)