2013-10-25 2 views
1

У меня проблема, если я запускаю этот код, все работает нормально до тех пор, пока я не попытаюсь получить доступ к значениям, возвращаемым этим методом. Он должен генерировать случайные байтовые байты. Он отлично работает, если я нахожусь в цикле больших чисел (один с j-счетчиком), но как только он выйдет, все значения в arraylist имеют последнее значение, которое было добавлено там. Это system.out.prints, где rainbow.get (0) .start и rainbow.get (1) .start.Weird byte ArrayList переписывает свои значения

В нижней части находится также класс Chain.

Куда это трахается?

public static ArrayList<Chain> genRainBow(){ 
    byte[] constant = new byte[8]; 

    ArrayList<byte[]> hashRed = new ArrayList<byte[]>(); 
    ArrayList<byte[]> variations = new ArrayList<byte[]>(); 

    ArrayList<Chain> rnbow = new ArrayList<Chain>(); 

    //rainbow = new ArrayList<Chain>(); 
    //byte[] start; 

    byte[] hash = null; 
    int collision = 0; 
    int allColl = 0; 

    Random rnd = new Random(); 
    byte[] randomBytes = new byte[8]; 

    byte[] red; 

    byte[] copyHash = null; 

    for(int j = 0; j < 1000; j++){ 

     hashRed = new ArrayList<byte[]>(); 
     collision = 0; 
     rnd.nextBytes(randomBytes); 
     red = truncate12(randomBytes); 
     byte[] start = red; 




     for(int i = 0; i < 50; i++){ 
      //System.out.println(i + " " + DatatypeConverter.printHexBinary(red)); 
      hash = Main.DES(red, constant); 
      //System.out.println(i + " " +DatatypeConverter.printHexBinary(hash)); 

      red = Main.reductionChain(hash, i); 

      if(containsList(hashRed, hash)) 
       collision++; 

      hashRed.add(hash); 

      //rainbow.put(red, hash); 

     } 



     hash = red; 
     rnbow.add(new Chain(start, hash)); 
    // rainbow.add(new Chain(start, hash)); 

     System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(j).start)); 

     if(!containsList(variations, hash)) 
      variations.add(hash); 

     System.out.println("Collision: " + collision); 
     System.out.println(); 
     allColl += collision; 

    } 
    System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(0).start)); 
    System.out.println("STR" + DatatypeConverter.printHexBinary(rainbow.get(1).start)); 
    System.out.println("variations: " + variations.size()); 
    System.out.println("all collisions: " + allColl); 
    System.out.println(); 

    return rnbow; 
} 

package rnbow; 

public class Chain { 
    byte[] start; 
    byte[] end; 

    public Chain(byte[] st, byte[] en){ 
     start = st; 
     end = en; 
    } 


    public byte[] printStart(){ 
     return start; 
    } 
} 

ответ

1

Изготовление радужного стола, который я вижу.

Но если все значения совпадают с последними, это означает, что вы не делаете новый байт [8] в любом месте и просто заменяете байты в единственном массиве (который вы указываете несколько раз в своем массиве ArrayList).

+0

спасибо, он был действительно скрыт там, randomBytes не были инициализированы в этом утверждении rnd.nextBytes (randomBytes); – totpiko

Смежные вопросы