1
1
package com .sbaars .adventofcode .year16 .days ;
2
2
3
3
import com .sbaars .adventofcode .year16 .Day2016 ;
4
+ import com .sbaars .adventofcode .common .MD5 ;
4
5
5
- import java .nio .charset .StandardCharsets ;
6
- import java .security .MessageDigest ;
7
- import java .security .NoSuchAlgorithmException ;
8
6
import java .util .Arrays ;
9
7
10
8
public class Day5 extends Day2016 {
@@ -23,22 +21,12 @@ public Object part1() {
23
21
StringBuilder password = new StringBuilder ();
24
22
int index = 0 ;
25
23
26
- try {
27
- MessageDigest md = MessageDigest .getInstance ("MD5" );
28
- while (password .length () < 8 ) {
29
- byte [] digest = md .digest ((doorId + index ).getBytes (StandardCharsets .UTF_8 ));
30
-
31
- // Check if first 20 bits (5 hex zeroes) are zero
32
- // digest[0] == 0 && digest[1] == 0 && (digest[2] & 0xF0) == 0
33
- if (digest [0 ] == 0 && digest [1 ] == 0 && (digest [2 ] & 0xF0 ) == 0 ) {
34
- // The 6th hex character is the low nibble of digest[2]
35
- int nib5 = digest [2 ] & 0x0F ;
36
- password .append (toHexChar (nib5 ));
37
- }
38
- index ++;
24
+ while (password .length () < 8 ) {
25
+ byte [] hash = MD5 .hash (doorId + index );
26
+ if (MD5 .hasLeadingZeros (hash , 5 )) {
27
+ password .append (MD5 .toHexChar (hash [2 ] & 0x0F ));
39
28
}
40
- } catch (NoSuchAlgorithmException e ) {
41
- throw new RuntimeException (e );
29
+ index ++;
42
30
}
43
31
return password .toString ();
44
32
}
@@ -51,30 +39,17 @@ public Object part2() {
51
39
int filled = 0 ;
52
40
int index = 0 ;
53
41
54
- try {
55
- MessageDigest md = MessageDigest .getInstance ("MD5" );
56
- while (filled < 8 ) {
57
- byte [] digest = md .digest ((doorId + index ).getBytes (StandardCharsets .UTF_8 ));
58
- // Same check as above
59
- if (digest [0 ] == 0 && digest [1 ] == 0 && (digest [2 ] & 0xF0 ) == 0 ) {
60
- // 6th hex character is nib5 (low nibble of digest[2]), 7th is nib6 (high nibble of digest[3])
61
- int nib5 = digest [2 ] & 0x0F ; // position
62
- int nib6 = (digest [3 ] & 0xF0 ) >>> 4 ; // actual character
63
-
64
- if (nib5 < 8 && password [nib5 ] == '_' ) {
65
- password [nib5 ] = toHexChar (nib6 );
66
- filled ++;
67
- }
42
+ while (filled < 8 ) {
43
+ byte [] hash = MD5 .hash (doorId + index );
44
+ if (MD5 .hasLeadingZeros (hash , 5 )) {
45
+ int pos = hash [2 ] & 0x0F ;
46
+ if (pos < 8 && password [pos ] == '_' ) {
47
+ password [pos ] = MD5 .toHexChar ((hash [3 ] & 0xF0 ) >>> 4 );
48
+ filled ++;
68
49
}
69
- index ++;
70
50
}
71
- } catch (NoSuchAlgorithmException e ) {
72
- throw new RuntimeException (e );
51
+ index ++;
73
52
}
74
53
return new String (password );
75
54
}
76
-
77
- private static char toHexChar (int nibble ) {
78
- return (char ) (nibble < 10 ? ('0' + nibble ) : ('a' + (nibble - 10 )));
79
- }
80
55
}
0 commit comments