2016-09-23 3 views
1

Я пытаюсь найти столкновение CRC32 в Java, а затем проверяет хэш с pycrc. Я пробовал то, что было описано в потоке this, но я все еще не могу добиться, чтобы моя реализация соответствовала pycrc. Что я делаю не так?CRC32 в Java, отличном от pycrc

public static void print() { 
     Checksum h = new CRC32(); 
     Map<Long, String> seen = new HashMap<Long, String>(); 

     while (true) { 
      String s = randomString(); 
      byte[] b = s.getBytes(StandardCharsets.UTF_8); 
      h.update(b, 0, b.length); 
      Long l = h.getValue(); 
      if (!seen.containsKey(l)) { 
       seen.put(l, s); 
      } else { 
       System.out.println(s + "; " + seen.get(l)); 
       return; 
      } 
     } 
    } 

Редактировать
После еще некоторого исследования, я обнаружил, что это не то, что pycrc является хеширования отличается от реализации Java, но это Java просто дает мне две строки с разными хэшей. Например, «93C7946B05» хешируется до «0xf2792761» и «323C239466» хэшей до «0x59fc1818», но когда Java сравнивает хеши (используя реализацию ниже), они кажутся «равными».

Обновленный код:

static char[] chars = "ABCDEF".toCharArray(); 

public static void print() { 
     Checksum h = new CRC32(); 
     String key; 
     Map<String, String> seen = new HashMap<String, String>(); 

     while (true) { 
      String s = randomString(); 
      byte[] b = s.getBytes(StandardCharsets.UTF_8); 
      h.update(b, 0, b.length); 
      Long l = h.getValue(); 
      key = Long.toHexString(l); 
      if (!seen.containsKey(key)) { 
       seen.put(key, s); 
      } else { 
       System.out.println(s + "; " + seen.get(key)); 
       return; 
      } 
     } 
    } 

public static String randomString() { 
     StringBuilder sb = new StringBuilder(); 
     Random random = new Random(); 
     //int len = random.nextInt(32) + 1; 
     //for (int i = 0; i < len; i++) { 
     for (int i = 0; i < 10; i++) { 
      char c = chars[random.nextInt(chars.length)]; 
      sb.append(c); 
     } 
     String output = sb.toString(); 
     return output; 
    } 
+0

См. Пример. –

+0

Как проверка коллизий по случайным данным ничего не доказывает? не говоря уже о несогласии с какой-то другой реализацией? – EJP

+0

@EJP Я просто пытаюсь найти столкновение. Считаете ли вы, что использование случайных данных не является хорошим способом сделать это? Должен ли я делать это более систематически? – fluffychaos

ответ

0

Ваша проблема заключается в том, что вы повторно использовать экземпляр CRC32 без вызова h.reset();.

Поэтому CRC32, который вы получаете, не предназначен для проверки текущей строки, а для конкат всех строк, которые вы тестировали до сих пор.