【发布时间】:2018-04-24 11:18:29
【问题描述】:
我知道滚动散列函数类似于有界队列上的散列。堆栈有类似的东西吗?
我的用例是我正在对可能的程序跟踪进行深度优先搜索(循环展开,因此这些堆栈可以得到 biiiiig),我需要通过这些跟踪识别分支。而不是存储一堆深度为 1000 的堆栈,我想对它们进行哈希处理,以便我可以按 int 进行索引。但是,如果我有深度为 10000+ 的堆栈,这个散列会很昂贵,所以我想跟踪我的最后一个散列,以便当我从堆栈中推送/弹出时,我可以分别散列/取消散列新/旧项目。
特别是,我正在寻找带有 unhash u(Object, Hash) 的散列 h(Object, Hash),其属性是要对对象 x 进行散列处理:
u(x, h(x, baseHash)) = baseHash
此外,这个哈希不应该是可交换的,因为顺序很重要。
我的一个想法是GL(2, F(2^k)) 上的矩阵乘法,也许使用凯莱图?例如,在GL(2, F(2^k)) 中取两个可逆矩阵A_0、A_1,以及逆矩阵B_0 和B_1,并通过首先计算一些带有位@987654332 的整数散列来计算对象x 的散列@,然后计算
H(x) = A_b31 . A_b30 . ... . A_b1 . A_b0
这有一个逆向
U(x) = B_b0 . B_b1 . ... . B_b30 . B_31.
因此h(x, baseHash) = H(x) . baseHash 和u(x, baseHash) = U(x) . baseHash,这样
u(x, h(x, base)) = U(x) . H(x) . base = base,
根据需要。
这看起来可能比必要的要贵,但对于 2x2 矩阵,它应该不会太糟糕吗?
【问题讨论】: