migrate HC
diff --git a/rand_hc/src/hc128.rs b/rand_hc/src/hc128.rs
index 94d7577..ef4734c 100644
--- a/rand_hc/src/hc128.rs
+++ b/rand_hc/src/hc128.rs
@@ -68,6 +68,11 @@
 
 impl RngCore for Hc128Rng {
     #[inline]
+    fn next_bool(&mut self) -> bool {
+        self.0.next_bool()
+    }
+
+    #[inline]
     fn next_u32(&mut self) -> u32 {
         self.0.next_u32()
     }
@@ -106,7 +111,7 @@
 
 impl PartialEq for Hc128Rng {
     fn eq(&self, rhs: &Self) -> bool {
-        self.0.core == rhs.0.core && self.0.index() == rhs.0.index()
+        self.0.eq(&rhs.0)
     }
 }
 impl Eq for Hc128Rng {}
@@ -125,9 +130,31 @@
     }
 }
 
+/// Type representing result of the [`Hc128Core`] iteration
+#[derive(Eq, PartialEq, Clone, Debug)]
+#[repr(align(4))]
+pub struct Results([u8; 64]);
+
+impl Default for Results {
+    fn default() -> Self {
+        Self([0u8; 64])
+    }
+}
+
+impl AsRef<[u8]> for Results {
+    fn as_ref(&self) -> &[u8] {
+        &self.0
+    }
+}
+
+impl AsMut<[u8]> for Results {
+    fn as_mut(&mut self) -> &mut [u8] {
+        &mut self.0
+    }
+}
+
 impl BlockRngCore for Hc128Core {
-    type Item = u32;
-    type Results = [u32; 16];
+    type Results = Results;
 
     fn generate(&mut self, results: &mut Self::Results) {
         assert!(self.counter1024 % 16 == 0);
@@ -142,42 +169,52 @@
         assert!(cc + 15 < 512);
         assert!(dd < 512);
 
+        macro_rules! step {
+            (
+                $f:ident, $n:expr,
+                $a:expr, $b:expr, $c:expr, $d:expr, $e:expr
+            ) => {
+                let v = self.$f($a,  $b,  $c, $d,  $e);
+                results.0[4*$n..4*($n+1)].copy_from_slice(&v.to_le_bytes());
+            };
+        }
+
         if self.counter1024 & 512 == 0 {
             // P block
-            results[0]  = self.step_p(cc+0,  cc+1,  ee+13, ee+6,  ee+4);
-            results[1]  = self.step_p(cc+1,  cc+2,  ee+14, ee+7,  ee+5);
-            results[2]  = self.step_p(cc+2,  cc+3,  ee+15, ee+8,  ee+6);
-            results[3]  = self.step_p(cc+3,  cc+4,  cc+0,  ee+9,  ee+7);
-            results[4]  = self.step_p(cc+4,  cc+5,  cc+1,  ee+10, ee+8);
-            results[5]  = self.step_p(cc+5,  cc+6,  cc+2,  ee+11, ee+9);
-            results[6]  = self.step_p(cc+6,  cc+7,  cc+3,  ee+12, ee+10);
-            results[7]  = self.step_p(cc+7,  cc+8,  cc+4,  ee+13, ee+11);
-            results[8]  = self.step_p(cc+8,  cc+9,  cc+5,  ee+14, ee+12);
-            results[9]  = self.step_p(cc+9,  cc+10, cc+6,  ee+15, ee+13);
-            results[10] = self.step_p(cc+10, cc+11, cc+7,  cc+0,  ee+14);
-            results[11] = self.step_p(cc+11, cc+12, cc+8,  cc+1,  ee+15);
-            results[12] = self.step_p(cc+12, cc+13, cc+9,  cc+2,  cc+0);
-            results[13] = self.step_p(cc+13, cc+14, cc+10, cc+3,  cc+1);
-            results[14] = self.step_p(cc+14, cc+15, cc+11, cc+4,  cc+2);
-            results[15] = self.step_p(cc+15, dd+0,  cc+12, cc+5,  cc+3);
+            step!(step_p, 0, cc+0,  cc+1,  ee+13, ee+6,  ee+4);
+            step!(step_p, 1, cc+1,  cc+2,  ee+14, ee+7,  ee+5);
+            step!(step_p, 2, cc+2,  cc+3,  ee+15, ee+8,  ee+6);
+            step!(step_p, 3, cc+3,  cc+4,  cc+0,  ee+9,  ee+7);
+            step!(step_p, 4, cc+4,  cc+5,  cc+1,  ee+10, ee+8);
+            step!(step_p, 5, cc+5,  cc+6,  cc+2,  ee+11, ee+9);
+            step!(step_p, 6, cc+6,  cc+7,  cc+3,  ee+12, ee+10);
+            step!(step_p, 7, cc+7,  cc+8,  cc+4,  ee+13, ee+11);
+            step!(step_p, 8, cc+8,  cc+9,  cc+5,  ee+14, ee+12);
+            step!(step_p, 9, cc+9,  cc+10, cc+6,  ee+15, ee+13);
+            step!(step_p, 10, cc+10, cc+11, cc+7,  cc+0,  ee+14);
+            step!(step_p, 11, cc+11, cc+12, cc+8,  cc+1,  ee+15);
+            step!(step_p, 12, cc+12, cc+13, cc+9,  cc+2,  cc+0);
+            step!(step_p, 13, cc+13, cc+14, cc+10, cc+3,  cc+1);
+            step!(step_p, 14, cc+14, cc+15, cc+11, cc+4,  cc+2);
+            step!(step_p, 15, cc+15, dd+0,  cc+12, cc+5,  cc+3);
         } else {
             // Q block
-            results[0]  = self.step_q(cc+0,  cc+1,  ee+13, ee+6,  ee+4);
-            results[1]  = self.step_q(cc+1,  cc+2,  ee+14, ee+7,  ee+5);
-            results[2]  = self.step_q(cc+2,  cc+3,  ee+15, ee+8,  ee+6);
-            results[3]  = self.step_q(cc+3,  cc+4,  cc+0,  ee+9,  ee+7);
-            results[4]  = self.step_q(cc+4,  cc+5,  cc+1,  ee+10, ee+8);
-            results[5]  = self.step_q(cc+5,  cc+6,  cc+2,  ee+11, ee+9);
-            results[6]  = self.step_q(cc+6,  cc+7,  cc+3,  ee+12, ee+10);
-            results[7]  = self.step_q(cc+7,  cc+8,  cc+4,  ee+13, ee+11);
-            results[8]  = self.step_q(cc+8,  cc+9,  cc+5,  ee+14, ee+12);
-            results[9]  = self.step_q(cc+9,  cc+10, cc+6,  ee+15, ee+13);
-            results[10] = self.step_q(cc+10, cc+11, cc+7,  cc+0,  ee+14);
-            results[11] = self.step_q(cc+11, cc+12, cc+8,  cc+1,  ee+15);
-            results[12] = self.step_q(cc+12, cc+13, cc+9,  cc+2,  cc+0);
-            results[13] = self.step_q(cc+13, cc+14, cc+10, cc+3,  cc+1);
-            results[14] = self.step_q(cc+14, cc+15, cc+11, cc+4,  cc+2);
-            results[15] = self.step_q(cc+15, dd+0,  cc+12, cc+5,  cc+3);
+            step!(step_q, 0, cc+0,  cc+1,  ee+13, ee+6,  ee+4);
+            step!(step_q, 1, cc+1,  cc+2,  ee+14, ee+7,  ee+5);
+            step!(step_q, 2, cc+2,  cc+3,  ee+15, ee+8,  ee+6);
+            step!(step_q, 3, cc+3,  cc+4,  cc+0,  ee+9,  ee+7);
+            step!(step_q, 4, cc+4,  cc+5,  cc+1,  ee+10, ee+8);
+            step!(step_q, 5, cc+5,  cc+6,  cc+2,  ee+11, ee+9);
+            step!(step_q, 6, cc+6,  cc+7,  cc+3,  ee+12, ee+10);
+            step!(step_q, 7, cc+7,  cc+8,  cc+4,  ee+13, ee+11);
+            step!(step_q, 8, cc+8,  cc+9,  cc+5,  ee+14, ee+12);
+            step!(step_q, 9, cc+9,  cc+10, cc+6,  ee+15, ee+13);
+            step!(step_q, 10, cc+10, cc+11, cc+7,  cc+0,  ee+14);
+            step!(step_q, 11, cc+11, cc+12, cc+8,  cc+1,  ee+15);
+            step!(step_q, 12, cc+12, cc+13, cc+9,  cc+2,  cc+0);
+            step!(step_q, 13, cc+13, cc+14, cc+10, cc+3,  cc+1);
+            step!(step_q, 14, cc+14, cc+15, cc+11, cc+4,  cc+2);
+            step!(step_q, 15, cc+15, dd+0,  cc+12, cc+5,  cc+3);
         }
         self.counter1024 = self.counter1024.wrapping_add(16);
     }