Was ist der schnellste Weg, um alle Bits innerhalb eines Java-Byte-Arrays zufällig (aber wiederholt) zu permutieren? Ich habe es erfolgreich mit einem BitSet versucht, aber gibt es einen schnelleren Weg? Offensichtlich verbraucht die For-Schleife den Großteil der CPU-Zeit.Schnellste Möglichkeit, Bits in einem Java-Array zu permutieren
Ich habe gerade ein Profiling in meiner IDE gemacht und die for-Schleife macht 64% der CPU-Zeit innerhalb der gesamten Methode permute() aus.
Um zu verdeutlichen, enthält das Array (preRound) eine bestehende Reihe von Zahlen, die in die Prozedur gehen. Ich möchte, dass die einzelnen gesetzten Bits dieses Arrays zufällig gemischt werden. Dies ist der Grund für P []. Es enthält eine zufällige Liste von Bitpositionen. Wenn also zum Beispiel das Bit 13 von preRound gesetzt ist, wird es an den Platz von P [13] von postRound übertragen. Dies könnte an Position 20555 von postRound sein. Das Ganze ist Teil eines Ersatz-Permutations-Netzwerkes, und ich suche den schnellsten Weg, die eingehenden Bits zu permutieren.
Mein Code so weit ...
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;
}
FYI, blocksize etwa 60000 und P ist eine zufällige Lookup-Tabelle.
Zufallszahlen 32bit generieren, bis Sie genug haben zufällig jedes Byte festgelegt. – JustinDanielson
Um klarzustellen, wollen Sie im technischen Sinn eine [Permutation] (http://en.wikipedia.org/wiki/Permutation) permutieren? Oder wollen Sie einfach nur zufällige Bytes im Array? Wenn ersteres, was meinst du mit "zufällig" permutieren sie? Wenn letzteres ist, ist ['Random.nextBytes'] (http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextBytes (byte [])) was du bist Auf der Suche nach? – yshavit
Was genau ist 'P'? – RealSkeptic