【发布时间】:2015-04-23 11:29:02
【问题描述】:
我正在开发一个程序,该程序将根据数据和正确数据的哈希值修复数据损坏。即使只处理几个字节的数据,在大约 4 或 5 位被破坏后它开始变慢,所以我想我会让它迭代而不是递归。在做了一些研究之后,我发现我可以使用堆栈来做到这一点。我目前无法找到从堆栈中弹出变量的正确位置。这是原始方法。
private static void fixFile(byte[] data, byte[] hash, byte[] correctHash, MessageDigest hasher, long depth)
{
int len = data.length;
outer: for(int i = 0; i < len; i++)
{
byte origVal = data[i];
for(int j = 0; j < 8; j++)
{
data[i] = (byte) (data[i] ^ (1 << j));
if(depth > 1)
fixFile(data, hash, correctHash, hasher, depth - 1);
hash = hasher.digest(data);
if(!Arrays.equals(correctHash, hash))
data[i] = origVal;
else
break outer;
}
}
}
这是我尝试使其迭代的修改方法。
private static void fixFile(byte[] data, byte[] hash, byte[] correctHash, MessageDigest hasher, long depth)
{
Stack stack = new Stack<Integer>();
int len = data.length;
outer: for(int i = 0; i < len; i++)
{
byte origVal = data[i];
for(int j = 0; j < 8; j++)
{
data[i] = (byte) (data[i] ^ (1 << j));
if(depth > 1)
{
stack.push(depth);
stack.push(i);
stack.push(j);
depth--;
i = -1;
j = 0;
continue outer;
}
else
{
// where do I put this to make it work.
j = stack.pop();
i = stack.pop();
depth = stack.pop();
}
hash = hasher.digest(data);
if(!Arrays.equals(correctHash, hash))
data[i] = origVal;
else
break outer;
}
}
}
【问题讨论】:
-
确定它真的有用吗?如果即使是少量比特也很慢,那么看起来算法有问题,而不是实现细节。
-
我认为它的位数很少,因为它需要在每次更改时重新计算散列。散列算法可能是导致大部分缓慢的原因吗?我在测试时使用的是 md5。
标签: java algorithm recursion stack iteration