It's equally fast, but it's measurably smaller.
---
 src/util.c | 34 +++++++++++-----------------------
 1 file changed, 11 insertions(+), 23 deletions(-)

diff --git src/util.c src/util.c
index fefa8333..c27d77c4 100644
--- src/util.c
+++ src/util.c
@@ -61,6 +61,10 @@ static void surf(void)
   u32 t[12]; u32 x; u32 sum = 0;
   int r; int i; int loop;
 
+  // Overflowing 32-bit counter is trivial, overflowing 64-bit counter takes 
146 years
+  // at 4 GHz rate. So let counter be 64-bit as 128-bit counter is excessive.
+  in[0]++; in[1] += !in[0];
+
   for (i = 0;i < 12;++i) t[i] = in[i] ^ seed[12 + i];
   for (i = 0;i < 8;++i) out[i] = seed[24 + i];
   x = t[11];
@@ -73,43 +77,27 @@ static void surf(void)
     }
     for (i = 0;i < 8;++i) out[i] ^= t[i + 4];
   }
+
+  outleft = 8;
 }
 
 unsigned short rand16(void)
 {
-  if (!outleft) 
-    {
-      if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
-      surf();
-      outleft = 8;
-    }
-  
-  return (unsigned short) out[--outleft];
+  return (unsigned short)rand32();
 }
 
 u32 rand32(void)
 {
- if (!outleft) 
-    {
-      if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
-      surf();
-      outleft = 8;
-    }
-  
-  return out[--outleft]; 
+  if (!outleft)
+    surf();
+  return out[--outleft];
 }
 
 u64 rand64(void)
 {
   if (outleft < 2)
-    {
-      if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
-      surf();
-      outleft = 8;
-    }
-  
+    surf();
   outleft -= 2;
-
   return (u64)out[outleft+1] + (((u64)out[outleft]) << 32);
 }
 
-- 
2.34.1


_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss

Reply via email to