2016-09-23 2 views
1

JavaでCRC32の衝突を見つけようとしていて、pycrcでハッシュをチェックしています。私はthisスレッドで説明されたものを試しましたが、私はまだpycrcと一致する実装を得ることができません。私は間違って何をしていますか?pycrcとは異なるJavaのCRC32

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; 
      } 
     } 
    } 

編集
いくつかのより多くの調査の後、私はそれがJavaの実装は異なるハッシングされますが、Javaは単に私に異なるハッシュ値を持つ2つの文字列を与えていることをそのpycrcではないことがわかりました。たとえば、 "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

あなたの問題は、あなたがh.reset();を呼び出さずにCRC32インスタンスを再使用することです。

したがって、あなたが得たCRC32は現在の文字列をテストするのではなく、これまでにテストしたすべての文字列を連結するためのものです。

関連する問題