對Java字節數組中的所有位進行隨機(但重複)置換的最快方法是什麼?我試過用BitSet成功做到這一點,但是有沒有更快的方法?很明顯,for循環消耗了大部分CPU時間。在Java數組中排列位的最快方法
我剛剛在我的IDE中完成了一些分析,for循環構成了整個permute()方法中64%的cpu時間。
爲了說明問題,數組(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;
}
僅供參考,塊大小是約60000和P是隨機查找表。
隨機生成的32位整數,直到你有足夠的隨機設置每個字節。 – JustinDanielson
爲了澄清,你想排列[技術意義上的[排列](http://en.wikipedia.org/wiki/Permutation)?或者你只是想基本上在數組中的隨機字節?如果前者,「隨機」排列它們意味着什麼?如果後者是['Random.nextBytes'](http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextBytes(byte [])),你是什麼尋找? – yshavit
「P」究竟是什麼? – RealSkeptic