散列函数对象

时间:2014-12-03 20:57:54

标签: python function hash

我正在尝试编写一些代码来为每个返回不同输出的函数调用生成唯一的哈希值。该函数是确定性的,其输出值仅取决于输入参数。

import os
import functools
import hashlib
import numpy as np
import inspect


def generate_hash(dictionary):
    args = []
    for key,item in dictionary.iteritems():
        if key == 'self': continue
        if isinstance(item,functools.partial):
            args.append((key,inspect.getsourcelines(item.func),
                generate_hash(item.keywords)))
        elif inspect.isfunction(item):
            args.append((key,inspect.getsourcelines(item),generate_hash(item.__dict__)))
        elif isinstance(item,np.ndarray):
            args.append((key,item.data))
        else:
            args.append((key,item))

    return hashlib.sha224(str(args)).hexdigest()

class Foo(object):
    def __init__(self, axis):
        super(Foo, self).__init__()

        self.axis    = axis
        self.ft_func = lambda ft: np.mean(ft,axis = self.axis)

    def extract(self,ft,ft_func):
        _cache = generate_hash(locals())
        if os.path.isfile(_cache):
            # Load data from cache
        else:
            # Compute data, cache
        return _cache

从示例中可以看出,对于ft的不同值,extract返回的哈希值将发生变化。但修改Foo(axis=X)的值不会影响它。原因是,我需要在generate_hash中确定ft_func的const值,并使用它们来创建哈希值。

例如:

foo = Foo(1)
print foo.extract(1,ft_func=foo.ft_func) -> 1a72fe1d0...

foo = Foo(2)
print foo.extract(1,ft_func=foo.ft_func) -> 1a72fe1d0...

foo = Foo(2)
print foo.extract(2,ft_func=foo.ft_func) -> 504307731...

我在没有找到解决方案的情况下彻底阅读了模块inspect的文档。

有什么建议吗?

Python memoization :在另一个线程上指出,是的,它是相同的想法,但我找不到在不同会话中持久的实现。

0 个答案:

没有答案