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;
}
例を示してください。 –
ランダムなデータのチェック衝突は何について何かを証明しますか?他の実装にも同意できませんか? – EJP
@EJP私はちょうど衝突を見つけようとしています。ランダムなデータを使用するのは良い方法ではないと思いますか?私はそれをより体系的にしなければならないのでしょうか? – fluffychaos