1) Medmindre du er igang med at kod ebrute force attack på en krypterings algoritme eller lignende så bør forskellen på XOR af int og byte ikke have signifikant betydning for den samlede performance.
2) Selv hvor XOR er vigtig så kan måde data hentes og processes på være mere vigtig end selve XOR.
Prøv f.eks. at køre dette eksempel:
public class XOR { private static final int LEN = 10000; private static final int REP = 10000; private static void testIAsimple(int[] ik, int[] ia, int[] ia2) { for(int i = 0; i < ia.length; i++) { ia2[i] = ik[i % ik.length] ^ ia[i]; } } private static void testIAadvanced(int[] ik, int[] ia, int[] ia2) { int m = (ia.length / ik.length) * ik.length; for(int i = 0; i < m; i += ik.length) { for(int j = 0; j < ik.length; j++) { ia2[i + j] = ik[j] ^ ia[i + j]; } } for(int i = m; i < ia.length; i++) { ia2[i] = ik[i % ik.length] ^ ia[i]; } } private static void testBAsimple(byte[] bk, byte[] ba, byte[] ba2) { for(int i = 0; i < ba.length; i++) { ba2[i] = (byte) (bk[i % bk.length] ^ ba[i]); } } private static void testBAadvanced(byte[] bk, byte[] ba, byte[] ba2) { int m = (ba.length / bk.length) * bk.length; for(int i = 0; i < m; i += bk.length) { for(int j = 0; j < bk.length; j++) { ba2[i + j] = (byte) (bk[j] ^ ba[i + j]); } } for(int i = m; i < ba.length; i++) { ba2[i] = (byte) (bk[i % bk.length] ^ ba[i]); } } public static void main(String[] args) { int[] ik = { 1, 2, 3, 4, 5, 6 }; int[] ia = new int[LEN]; int[] ia2 = new int[LEN]; for(int i = 0; i < LEN; i++) { ia[i] = i; } long t1 = System.currentTimeMillis(); for(int i = 0; i < REP; i++) { testIAsimple(ik, ia, ia2); } long t2 = System.currentTimeMillis(); System.out.println("int[] simple : " + (t2 - t1) + " (" + ia2[0] + "," + ia2[LEN-1] + ")"); long t3 = System.currentTimeMillis(); for(int i = 0; i < REP; i++) { testIAadvanced(ik, ia, ia2); } long t4 = System.currentTimeMillis(); System.out.println("int[] advanced : " + (t4 - t3) + " (" + ia2[0] + "," + ia2[LEN-1] + ")"); byte[] bk = { 1, 2, 3, 4, 5, 6 }; byte[] ba = new byte[LEN]; byte[] ba2 = new byte[LEN]; for(int i = 0; i < LEN; i++) { ba[i] = (byte) i; } long t5 = System.currentTimeMillis(); for(int i = 0; i < REP; i++) { testBAsimple(bk, ba, ba2); } long t6 = System.currentTimeMillis(); System.out.println("byte[] simple : " + (t6 - t5) + " (" + ba2[0] + "," + ba2[LEN-1] + ")"); long t7 = System.currentTimeMillis(); for(int i = 0; i < REP; i++) { testBAadvanced(bk, ba, ba2); } long t8 = System.currentTimeMillis(); System.out.println("byte[] advanced : " + (t8 - t7) + " (" + ba2[0] + "," + ba2[LEN-1] + ")"); } }
Hej igen. Jeg har implemeteret en krypteringsalgoritme, Rijndael. Den arbejder kun med tal fra 0-255, og for at peppe den op, ville jeg f.eks. gemme hvert tal i et byte i stedet for en int.
Jeg har brug for at XOR´re bytes, derfor vil evt. optimering, være at gemme 2*4 bytes i 2 ints, og derefter XOR disse, og bagefter læse 4 bytes fra resultatet igen fra Integeren. Dette giver en førøgning på 3X. har lige prøvet.
Tak for al hjælpen.
Kan C++ gemme mellemresultater i byte(8bit) ?
Troede ellers at problemet var ALU´en i processoren der konsekvent arbejder på 32-bit..
Nu er det jo ikke sådan at et Java-program kan give to forskellige resultater, afhængig af hvad processor den kører på. Beregningsmetoden er bestemt i definitionen af Java.
Både nøgle og data er i bytes. Jeg pakker 4 bytes fra nøglen ind i en Integer, 4 bytes fra nøglen ind i en Integer or XOR derefter begge Integers. og læser resultatet tilbage i 4 bytes.
Dette er hurtigere end at XOR bytes enkeltvis, da resultatet af XOR(byte,byte) skal gemmes i en Integer, fordi da skal man igen type kaste til bytes..og dette tager længere tid..
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.