«Хотелось бы, чтобы мой crc32 был 802892ef ...»
Ну, я подумал, что это было интересно, поэтому сегодня я написал небольшую Java-программу для поиска коллизий. Думаю, я бы оставил это здесь на случай, если кто-то найдет это полезным:
import java.util.zip.CRC32;
public class Crc32_recurse2 {
public static void main(String[] args) throws InterruptedException {
long endval = Long.parseLong("ffffffff", 16);
long startval = 0L;
// startval = Long.parseLong("802892ef",16); //uncomment to save yourself some time
float percent = 0;
long time = System.currentTimeMillis();
long updates = 10000000L; // how often to print some status info
for (long i=startval;i<endval;i++) {
String testval = Long.toHexString(i);
String cmpval = getCRC("I wish my crc32 was " + testval + "...");
if (testval.equals(cmpval)) {
System.out.println("Match found!!! Message is:");
System.out.println("I wish my crc32 was " + testval + "...");
System.out.println("crc32 of message is " + testval);
System.exit(0);
}
if (i%updates==0) {
if (i==0) {
continue; // kludge to avoid divide by zero at the start
}
long timetaken = System.currentTimeMillis() - time;
long speed = updates/timetaken*1000;
percent = (i*100.0f)/endval;
long timeleft = (endval-i)/speed; // in seconds
System.out.println(percent+"% through - "+ "done "+i/1000000+"M so far"
+ " - " + speed+" tested per second - "+timeleft+
"s till the last value.");
time = System.currentTimeMillis();
}
}
}
public static String getCRC(String input) {
CRC32 crc = new CRC32();
crc.update(input.getBytes());
return Long.toHexString(crc.getValue());
}
}
Выход:
49.825756% through - done 2140M so far - 1731000 tested per second - 1244s till the last value.
50.05859% through - done 2150M so far - 1770000 tested per second - 1211s till the last value.
Match found!!! Message is:
I wish my crc32 was 802892ef...
crc32 of message is 802892ef
Обратите внимание, что точки в конце сообщения на самом деле являются частью сообщения.
На моем i5-2500 потребовалось ~ 40 минут для поиска всего пространства crc32 от 00000000 до ffffffff, выполняя около 1,8 миллиона тестов в секунду. Это было максимум одного ядра.
Я довольно новичок в Java, поэтому любые конструктивные комментарии к моему коду будут приветствоваться.
«Мой crc32 был c8cb204, и все, что я получил, это паршивая футболка!»