1

我明白这个问题很奇怪,不是我一贯的风格。我目前正在使用 peersim 中的和弦实现做一个项目。下面的代码显示了一个大整数和对其执行的一些操作。MychordId是一个对象的哈希,为什么要使用add()?这有什么用?

BigInteger base;
if (j == 0)
    base = BigInteger.ONE;
else {
    base = BigInteger.valueOf(2);
    for (int exp = 1; exp < j; exp++) {
        base = base.multiply(BigInteger.valueOf(2));
    }
}
BigInteger pot = cp.chordId.add(base);

在他之前,和弦 ID 只是 128 位 idlength 的随机整数。

因此,我的问题是上面的代码是做什么add()用的???

[编辑]

为了让这个问题更清楚,从某种角度来看:

cp.fingerTable[j] = findId(pot, 0, Network.size() - 1);

调用它试图找到 Pot 的 Id,但是它总是返回错误,因为在此方法中创建的 chordId 不存在。我不确定用什么替换锅或是否将其完全取出。

[编辑2]

findId看起来像这样(这不是我的代码,因此我很困惑:))

public Node findId(BigInteger id, int nodeOne, int nodeTwo) {
    if (nodeOne >= (nodeTwo - 1))
        return Network.get(nodeOne);
    int middle = (nodeOne + nodeTwo) / 2;
    if (((middle) >= Network.size() - 1))
        System.out.print("ERROR: Middle is bigger than Network.size");
    if (((middle) <= 0))
        return Network.get(0);
    try {
        BigInteger newId = ((ChordProtocol) ((Node) Network.get(middle))
                .getProtocol(pid)).chordId;
        BigInteger lowId;
        if (middle > 0)
            lowId = ((ChordProtocol) ((Node) Network.get(middle - 1))
                    .getProtocol(pid)).chordId;
        else
            lowId = newId;
        BigInteger highId = ((ChordProtocol) ((Node) Network
                .get(middle + 1)).getProtocol(pid)).chordId;
        if (id.compareTo(newId) == 0
                || ((id.compareTo(newId) == 1) && (id.compareTo(highId) == -1))) {
            return Network.get(middle);
        }
        if ((id.compareTo(newId) == -1) && (id.compareTo(lowId) == 1)) {
            if (middle > 0)
                return Network.get(middle - 1);
            else
                return Network.get(0);
        }
        if (id.compareTo(newId) == -1) {
            return findId(id, nodeOne, middle);
        } else if (id.compareTo(newId) == 1) {
            return findId(id, middle, nodeTwo);
        }
        return null;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
4

4 回答 4

5

base如果是 int 而不是 a ,这就是代码的样子BigInteger

int base;
if (j == 0)
    base = 1;
else {
    base = 2;
    for (int exp = 1; exp < j; exp++) {
        base = base * 2;
    }
}
int pot = cp.chordId + base;

实际上,整个代码片段可以替换为:

BigInteger base = BigInteger.valueOf(2).pow(j);
BigInteger pot = cp.chordId.add(base);

这意味着它相当于:

int base = (int) Math.pow(2, j);
int pot = cp.chordId + base;

它基本上增加了2 jcp.chordId

于 2011-11-23T21:05:40.157 回答
1

它正在计算 2 ** j,然后将其添加到 cp.chordId。if 是针对 s ** 0 = 1 的特殊情况,这并不是真正需要的。

于 2011-11-23T21:09:00.267 回答
1

add() 上面的代码是做什么用的?

cp.chordId是 类型BigIntegeradd()用于将对象添加cp.chordId到传递的对象中base,并返回一个新BigInteger的,其值是同时添加BigInteger's:cp.chordIdbase.

于 2011-11-23T21:09:07.860 回答
1
cp.chordId.add(base);

有了它,它看起来像是试图cp.chordId根据 的值给出一个基值j

因此,如果j为 0,则基值chordid将是BigInteger.ONE,否则基值chorid将是"2 ^ j"(即 2 j)。

于 2011-11-23T21:12:58.410 回答