散列大型任意对象的最快方法是什么?

2024-03-29 08:08:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个方法来生成缓存键来缓存函数结果,这个键是基于函数名和散列值相结合的参数。在

目前我正在使用hashlib来散列参数的序列化版本,但是序列化大型对象的操作非常昂贵,那么还有什么替代方法呢?在

#get the cache key for storage
def cache_get_key(*args):
    import hashlib
    serialise = []
    for arg in args:
        serialise.append(str(arg))
    key = hashlib.md5("".join(serialise)).hexdigest()
    return key

更新: 我尝试过使用hash(str(args)),但如果arg中包含相对较大的数据,则仍然需要很长时间来计算哈希值。有更好的方法吗?在

实际上,str(args)与大数据需要永远。。。在


Tags: 数据方法key函数cachefor参数get
3条回答
def cache_get_key(*args):
    return hash(str(args))

或者(如果您真的想使用hashlib库)

^{pr2}$

我不会费心重写代码来将数组变成字符串。使用内置的那个。在

替代方案

以下是8bitwide建议的解决方案。这个解决方案根本不需要哈希!在

def foo(x, y):
    return x+y+1

result1 = foo(1,1)
result2 = foo(2,3)

results = {}
results[foo] = {}
results[foo][ [1,1] ] = result1
results[foo][ [2,3] ] = result2

你试过使用hash函数吗?它在元组上工作得非常好。在

假设您创建了对象,并且它由更小的组件组成(它不是二进制blob),那么您可以在构建对象时使用其子组件的哈希来预计算哈希。在

例如,不是serialize(repr(arg)),而是arg.precomputedHash if isinstance(arg, ...) else serialize(repr(arg))

如果既不创建自己的对象,也不使用hash的对象,则可以保留一个objectreferences->;散列的memoization表,前提是不改变对象。最坏的情况是,您可以使用允许记忆的函数式语言,因为这样一种语言中的所有对象都可能是不可变的,因此是可散列的。在

相关问题 更多 >