【发布时间】:2015-04-22 23:39:06
【问题描述】:
随机(但重复)置换 Java 字节数组中所有位的最快方法是什么?我已经尝试使用 BitSet 成功地做到这一点,但是有更快的方法吗?显然 for 循环消耗了大部分的 cpu 时间。
我刚刚在我的 IDE 中进行了一些分析,for 循环占整个 permute() 方法中 CPU 时间的 64%。
为了澄清,数组(preRound)包含一个现有的数字数组,该数组将进入程序。我希望该数组的各个设置位以随机方式混合。这就是 P[] 的原因。它包含位位置的随机列表。因此,例如,如果 preRound 的第 13 位被设置,它将被转移到 postRound 的位置 P[13]。这可能位于 postRound 的位置 20555。整个事情是替换 - 置换网络的一部分,我正在寻找置换传入比特的最快方法。
到目前为止我的代码...
private byte[] permute(byte[] preRound) {
BitSet beforeBits = BitSet.valueOf(preRound);
BitSet afterBits = new BitSet(blockSize * 8);
for (int i = 0; i < blockSize * 8; i++) {
assert i != P[i];
if (beforeBits.get(i)) {
afterBits.set(P[i]);
}
}
byte[] postRound = afterBits.toByteArray();
postRound = Arrays.copyOf(postRound, blockSize); // Pad with 0s to the specified length
assert postRound.length == blockSize;
return postRound;
}
仅供参考,blockSize 约为 60,000,P 是随机查找表。
【问题讨论】:
-
生成随机的 32 位整数,直到你有足够的能力随机设置每个字节。
-
澄清一下,您想在permutation 的技术意义上进行置换吗?或者你只是想要数组中的基本随机字节?如果是前者,“随机”排列它们是什么意思?如果是后者,
Random.nextBytes是您要找的吗? -
P到底是什么? -
你的随机查找表是否等同于排列的数学概念,即存在某个数字 n,这样当 P 应用 n 次时,每个输入都将映射到自身?
-
我认为 P 基本上是一个从 0 到 blocksize*8 的数字数组,没有以随机顺序重复。也就是说,它是一个域整数到同一范围内的另一个整数的双向无损映射。他显然还保证 P[i] 永远不会映射到自身。
标签: java arrays permutation