gpt4 book ai didi

java - 奇怪的字节 ArrayList 重写其值

转载 作者:太空宇宙 更新时间:2023-11-04 07:18:59 26 4
gpt4 key购买 nike

如果我运行此代码,我会遇到问题,一切正常,直到我尝试访问此方法返回的值为止。它应该生成随机字节哈希。如果我处于大 for 循环(带有 j 计数器的循环)中,它工作得很好,但是一旦它出来,数组列表中的所有值都是在那里添加的最后一个值。这就是 system.out.prints,其中有 Rainbow.get(0).start 和 Rainbow.get(1).start。

底部也是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;
}
}

最佳答案

制作一张彩虹 table ,我明白了。

但是,如果所有值都与上一个值相同,则意味着您没有在任何地方执行新的 byte[8],而只是替换单个数组中的字节(您在 ArrayList 中多次引用该数组)。

关于java - 奇怪的字节 ArrayList 重写其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583935/

26 4 0