8

Pickle は特定の入力値に対して常に同じ出力を生成しますか? 内容が同じで挿入/削除の履歴が異なる辞書をピクルする場合、問題が発生する可能性があると思います。私の目標は、メモ化の実装のために、Pickle と SHA1 を使用して、関数の引数の「署名」を作成することです。

4

2 に答える 2

9

内容が同じで挿入/削除の履歴が異なる辞書をピクルする場合、問題が発生する可能性があると思います。

右:

>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False

参照: pickle.dumps はハッシュには適していません

私の目標は、メモ化の実装のために、Pickle と SHA1 を使用して、関数の引数の「署名」を作成することです。

これには多くの根本的な問題があります。等価性を正しくマッピングするオブジェクトから文字列への変換を考え出すことは不可能です。オブジェクトの同一性の問題を考えてください。

>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True

正確な要件によっては、オブジェクト階層をハッシュできる階層に変換できる場合があります。

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
于 2009-06-12T07:06:00.617 に答える