1import{a as E,f}from"../chunks/dv0sMzV_.js";import"../chunks/CWS9ii_n.js";import{s,f as d,k as o,l as a,n as p}from"../chunks/SfqBPp_f.js";import{h as t}from"../chunks/BAt092Uo.js";var C=f(`<p>I've always been fascinated by how <code>rsync</code> can synchronize large files so quickly just by sending the differences. Instead of just reading about it again, I decided to actually implement the core engine behind it: the rolling checksum.</p> <p>Specifically, I spent the weekend with the Adler32 rolling implementation, following the research from Andrew Tridgell's original thesis.</p> <section><h2 id="the-modulo-trap">The Modulo Trap</h2><p>The "rolling" part of Adler32 is mathematically brilliant because it lets you calculate a new hash in <code>O(1)</code> time by just subtracting the byte that left the window and adding the new byte that entered. The magic number is <code>65521</code> (the largest prime under 2^16), which keeps the sums <code>a</code> and <code>b</code> within 16 bits.</p><p>Here's the math translated into Go:</p><pre class="language-go"></pre><p>...And here is where I lost an hour to a completely avoidable bug. In Go (and C, and many others), the <code>%</code> operator isn't actually a mathematical modulo, it's a remainder operator. If the dividend is negative after subtracting the <code>leave</code> byte, <code>%</code> can return a negative value.</p><p>To get a true mathematical modulo, I had to use the <code>((n % mod) + mod) % mod</code> pattern. It's an ugly, verbose little detail that completely ruins the checksum if you forget it. I assumed the standard library <code>hash/adler32</code> would have some magic helper for this, but it doesn't do rolling out of the box, so you're on your own.</p></section> <section><h2 id="manual-window-management">Manual Window Management</h2><p>To actually roll the hash, you need to know exactly which byte is falling out of the window. I implemented this using a simple slice:</p><pre class="language-go"></pre><p>This works, but it's honestly terrible for performance. Calling <code>append</code> and shifting the slice on every single byte means the garbage collector is going to have a field day. For a toy weekend project, a slice is fine for readability, but if I actually wanted to process gigabytes of data, I'd have to rewrite this entire thing using a pre-allocated circular buffer.</p></section> <section><h2 id="proving-i-didnt-break-it">Proving I Didn't Break It</h2><p>Because the math is so finicky, I had to write a battery of tests against Go's standard (non-rolling) <code>hash/adler32</code> implementation just to prove my math wasn't hallucinating values.</p><pre class="language-go"></pre><p>We spend so much of our time working with high-level abstractions like HTTP frameworks and ORMs that taking a weekend to deal with memory allocation and bitwise shifts feels almost therapeutic. I didn't build a production-ready <code>rsync</code> replacement. I just wanted to remember how the underlying mechanics actually work without a framework holding my hand.</p></section>`,1);function D(A){var e=C(),l=s(d(e),4),c=s(o(l),3);t(c,()=>`<span class="code-theme-dark"><code><span class="line"><span style="color:#31748F">const</span><span style="color:#E0DEF4;font-style:italic"> mod</span><span style="color:#31748F"> =</span><span style="color:#EBBCBA"> 65521</span></span> 2<span class="line"></span> 3<span class="line"><span style="color:#31748F">func</span><span style="color:#908CAA"> (</span><span style="color:#C4A7E7;font-style:italic">r </span><span style="color:#31748F">*</span><span style="color:#9CCFD8">RollSum</span><span style="color:#908CAA">)</span><span style="color:#EBBCBA"> Rotate</span><span style="color:#908CAA">(</span><span style="color:#C4A7E7;font-style:italic">b</span><span style="color:#31748F"> byte</span><span style="color:#908CAA">)</span><span style="color:#908CAA"> {</span></span> 4<span class="line"><span style="color:#31748F"> if</span><span style="color:#EBBCBA"> len</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">window</span><span style="color:#908CAA">)</span><span style="color:#31748F"> ==</span><span style="color:#EBBCBA"> 0</span><span style="color:#908CAA"> {</span></span> 5<span class="line"><span style="color:#31748F"> return</span></span> 6<span class="line"><span style="color:#908CAA"> }</span></span> 7<span class="line"></span> 8<span class="line"><span style="color:#E0DEF4;font-style:italic"> leave</span><span style="color:#908CAA">,</span><span style="color:#E0DEF4;font-style:italic"> enter</span><span style="color:#31748F"> :=</span><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">circle</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">b</span><span style="color:#908CAA">)</span></span> 9<span class="line"><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">a</span><span style="color:#31748F"> =</span><span style="color:#908CAA"> (((</span><span style="color:#E0DEF4;font-style:italic">r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">a</span><span style="color:#31748F"> +</span><span style="color:#E0DEF4;font-style:italic"> enter</span><span style="color:#31748F"> -</span><span style="color:#E0DEF4;font-style:italic"> leave</span><span style="color:#908CAA">)</span><span style="color:#31748F"> %</span><span style="color:#E0DEF4;font-style:italic"> mod</span><span style="color:#908CAA">)</span><span style="color:#31748F"> +</span><span style="color:#E0DEF4;font-style:italic"> mod</span><span style="color:#908CAA">)</span><span style="color:#31748F"> %</span><span style="color:#E0DEF4;font-style:italic"> mod</span></span> 10<span class="line"><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">b</span><span style="color:#31748F"> =</span><span style="color:#908CAA"> (((</span><span style="color:#E0DEF4;font-style:italic">r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">b</span><span style="color:#31748F"> -</span><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">windowLen</span><span style="color:#31748F">*</span><span style="color:#E0DEF4;font-style:italic">leave</span><span style="color:#31748F"> -</span><span style="color:#EBBCBA"> 1</span><span style="color:#31748F"> +</span><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">a</span><span style="color:#908CAA">)</span><span style="color:#31748F"> %</span><span style="color:#E0DEF4;font-style:italic"> mod</span><span style="color:#908CAA">)</span><span style="color:#31748F"> +</span><span style="color:#E0DEF4;font-style:italic"> mod</span><span style="color:#908CAA">)</span><span style="color:#31748F"> %</span><span style="color:#E0DEF4;font-style:italic"> mod</span></span> 11<span class="line"><span style="color:#908CAA">}</span></span></code></span><span class="code-theme-light"><code><span class="line"><span style="color:#286983">const</span><span style="color:#575279;font-style:italic"> mod</span><span style="color:#286983"> =</span><span style="color:#D7827E"> 65521</span></span> 12<span class="line"></span> 13<span class="line"><span style="color:#286983">func</span><span style="color:#797593"> (</span><span style="color:#907AA9;font-style:italic">r </span><span style="color:#286983">*</span><span style="color:#56949F">RollSum</span><span style="color:#797593">)</span><span style="color:#D7827E"> Rotate</span><span style="color:#797593">(</span><span style="color:#907AA9;font-style:italic">b</span><span style="color:#286983"> byte</span><span style="color:#797593">)</span><span style="color:#797593"> {</span></span> 14<span class="line"><span style="color:#286983"> if</span><span style="color:#D7827E"> len</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">window</span><span style="color:#797593">)</span><span style="color:#286983"> ==</span><span style="color:#D7827E"> 0</span><span style="color:#797593"> {</span></span> 15<span class="line"><span style="color:#286983"> return</span></span> 16<span class="line"><span style="color:#797593"> }</span></span> 17<span class="line"></span> 18<span class="line"><span style="color:#575279;font-style:italic"> leave</span><span style="color:#797593">,</span><span style="color:#575279;font-style:italic"> enter</span><span style="color:#286983"> :=</span><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#D7827E">circle</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">b</span><span style="color:#797593">)</span></span> 19<span class="line"><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">a</span><span style="color:#286983"> =</span><span style="color:#797593"> (((</span><span style="color:#575279;font-style:italic">r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">a</span><span style="color:#286983"> +</span><span style="color:#575279;font-style:italic"> enter</span><span style="color:#286983"> -</span><span style="color:#575279;font-style:italic"> leave</span><span style="color:#797593">)</span><span style="color:#286983"> %</span><span style="color:#575279;font-style:italic"> mod</span><span style="color:#797593">)</span><span style="color:#286983"> +</span><span style="color:#575279;font-style:italic"> mod</span><span style="color:#797593">)</span><span style="color:#286983"> %</span><span style="color:#575279;font-style:italic"> mod</span></span> 20<span class="line"><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">b</span><span style="color:#286983"> =</span><span style="color:#797593"> (((</span><span style="color:#575279;font-style:italic">r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">b</span><span style="color:#286983"> -</span><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">windowLen</span><span style="color:#286983">*</span><span style="color:#575279;font-style:italic">leave</span><span style="color:#286983"> -</span><span style="color:#D7827E"> 1</span><span style="color:#286983"> +</span><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">a</span><span style="color:#797593">)</span><span style="color:#286983"> %</span><span style="color:#575279;font-style:italic"> mod</span><span style="color:#797593">)</span><span style="color:#286983"> +</span><span style="color:#575279;font-style:italic"> mod</span><span style="color:#797593">)</span><span style="color:#286983"> %</span><span style="color:#575279;font-style:italic"> mod</span></span> 21<span class="line"><span style="color:#797593">}</span></span></code></span>`,!0),a(c),p(2),a(l);var n=s(l,2),r=s(o(n),2);t(r,()=>`<span class="code-theme-dark"><code><span class="line"><span style="color:#31748F">func</span><span style="color:#908CAA"> (</span><span style="color:#C4A7E7;font-style:italic">r </span><span style="color:#31748F">*</span><span style="color:#9CCFD8">RollSum</span><span style="color:#908CAA">)</span><span style="color:#EBBCBA"> circle</span><span style="color:#908CAA">(</span><span style="color:#C4A7E7;font-style:italic">b</span><span style="color:#31748F"> byte</span><span style="color:#908CAA">)</span><span style="color:#908CAA"> (</span><span style="color:#C4A7E7;font-style:italic">leave</span><span style="color:#908CAA">,</span><span style="color:#C4A7E7;font-style:italic"> enter</span><span style="color:#31748F"> uint32</span><span style="color:#908CAA">)</span><span style="color:#908CAA"> {</span></span> 22<span class="line"><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">removed</span><span style="color:#31748F"> =</span><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">window</span><span style="color:#908CAA">[</span><span style="color:#EBBCBA">0</span><span style="color:#908CAA">]</span></span> 23<span class="line"><span style="color:#E0DEF4;font-style:italic"> r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">window</span><span style="color:#31748F"> =</span><span style="color:#EBBCBA"> append</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">window</span><span style="color:#908CAA">[</span><span style="color:#EBBCBA">1</span><span style="color:#908CAA">:],</span><span style="color:#E0DEF4;font-style:italic"> b</span><span style="color:#908CAA">)</span></span> 24<span class="line"><span style="color:#E0DEF4;font-style:italic"> enter</span><span style="color:#31748F"> =</span><span style="color:#31748F"> uint32</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">b</span><span style="color:#908CAA">)</span></span> 25<span class="line"><span style="color:#E0DEF4;font-style:italic"> leave</span><span style="color:#31748F"> =</span><span style="color:#31748F"> uint32</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">r</span><span style="color:#908CAA">.</span><span style="color:#E0DEF4;font-style:italic">removed</span><span style="color:#908CAA">)</span></span> 26<span class="line"><span style="color:#31748F"> return</span></span> 27<span class="line"><span style="color:#908CAA">}</span></span></code></span><span class="code-theme-light"><code><span class="line"><span style="color:#286983">func</span><span style="color:#797593"> (</span><span style="color:#907AA9;font-style:italic">r </span><span style="color:#286983">*</span><span style="color:#56949F">RollSum</span><span style="color:#797593">)</span><span style="color:#D7827E"> circle</span><span style="color:#797593">(</span><span style="color:#907AA9;font-style:italic">b</span><span style="color:#286983"> byte</span><span style="color:#797593">)</span><span style="color:#797593"> (</span><span style="color:#907AA9;font-style:italic">leave</span><span style="color:#797593">,</span><span style="color:#907AA9;font-style:italic"> enter</span><span style="color:#286983"> uint32</span><span style="color:#797593">)</span><span style="color:#797593"> {</span></span> 28<span class="line"><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">removed</span><span style="color:#286983"> =</span><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">window</span><span style="color:#797593">[</span><span style="color:#D7827E">0</span><span style="color:#797593">]</span></span> 29<span class="line"><span style="color:#575279;font-style:italic"> r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">window</span><span style="color:#286983"> =</span><span style="color:#D7827E"> append</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">window</span><span style="color:#797593">[</span><span style="color:#D7827E">1</span><span style="color:#797593">:],</span><span styl
29e="color:#575279;font-style:italic"> b</span><span style="color:#797593">)</span></span> 30<span class="line"><span style="color:#575279;font-style:italic"> enter</span><span style="color:#286983"> =</span><span style="color:#286983"> uint32</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">b</span><span style="color:#797593">)</span></span> 31<span class="line"><span style="color:#575279;font-style:italic"> leave</span><span style="color:#286983"> =</span><span style="color:#286983"> uint32</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">r</span><span style="color:#797593">.</span><span style="color:#575279;font-style:italic">removed</span><span style="color:#797593">)</span></span> 32<span class="line"><span style="color:#286983"> return</span></span> 33<span class="line"><span style="color:#797593">}</span></span></code></span>`,!0),a(r),p(),a(n);var y=s(n,2),i=s(o(y),2);t(i,()=>`<span class="code-theme-dark"><code><span class="line"><span style="color:#31748F">package</span><span style="color:#9CCFD8"> rollsum</span></span> 34<span class="line"></span> 35<span class="line"><span style="color:#31748F">import</span><span style="color:#908CAA"> (</span></span> 36<span class="line"><span style="color:#F6C177"> "</span><span style="color:#EBBCBA">fmt</span><span style="color:#F6C177">"</span></span> 37<span class="line"><span style="color:#F6C177"> "</span><span style="color:#EBBCBA">hash/adler32</span><span style="color:#F6C177">"</span></span> 38<span class="line"><span style="color:#F6C177"> "</span><span style="color:#EBBCBA">testing</span><span style="color:#F6C177">"</span></span> 39<span class="line"><span style="color:#F6C177"> "</span><span style="color:#EBBCBA">github.com/stretchr/testify/assert</span><span style="color:#F6C177">"</span></span> 40<span class="line"><span style="color:#F6C177"> "</span><span style="color:#EBBCBA">github.com/stretchr/testify/require</span><span style="color:#F6C177">"</span></span> 41<span class="line"><span style="color:#908CAA">)</span></span> 42<span class="line"></span> 43<span class="line"><span style="color:#31748F">func</span><span style="color:#EBBCBA"> classic</span><span style="color:#908CAA">(</span><span style="color:#C4A7E7;font-style:italic">data</span><span style="color:#908CAA"> []</span><span style="color:#31748F">byte</span><span style="color:#908CAA">)</span><span style="color:#31748F"> uint32</span><span style="color:#908CAA"> {</span></span> 44<span class="line"><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#31748F"> :=</span><span style="color:#E0DEF4;font-style:italic"> adler32</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">New</span><span style="color:#908CAA">()</span></span> 45<span class="line"><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Write</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">data</span><span style="color:#908CAA">)</span></span> 46<span class="line"><span style="color:#31748F"> return</span><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Sum32</span><span style="color:#908CAA">()</span></span> 47<span class="line"><span style="color:#908CAA">}</span></span> 48<span class="line"></span> 49<span class="line"><span style="color:#31748F">func</span><span style="color:#EBBCBA"> TestRollInAndOut</span><span style="color:#908CAA">(</span><span style="color:#C4A7E7;font-style:italic">t</span><span style="color:#31748F"> *</span><span style="color:#9CCFD8">testing</span><span style="color:#908CAA">.</span><span style="color:#9CCFD8">T</span><span style="color:#908CAA">)</span><span style="color:#908CAA"> {</span></span> 50<span class="line"><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#31748F"> :=</span><span style="color:#908CAA"> []</span><span style="color:#31748F">byte</span><span style="color:#908CAA">(</span><span style="color:#F6C177">"Adler-32 is a checksum"</span><span style="color:#908CAA">)</span></span> 51<span class="line"><span style="color:#E0DEF4;font-style:italic"> roll</span><span style="color:#31748F"> :=</span><span style="color:#EBBCBA"> New</span><span style="color:#908CAA">(</span><span style="color:#EBBCBA">1</span><span style="color:#31748F"> <<</span><span style="color:#EBBCBA"> 16</span><span style="color:#908CAA">)</span></span> 52<span class="line"><span style="color:#31748F"> for</span><span style="color:#E0DEF4;font-style:italic"> _</span><span style="color:#908CAA">,</span><span style="color:#E0DEF4;font-style:italic"> x</span><span style="color:#31748F"> :=</span><span style="color:#31748F"> range</span><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#908CAA"> {</span></span> 53<span class="line"><span style="color:#E0DEF4;font-style:italic"> roll</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">In</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">x</span><span style="color:#908CAA">)</span></span> 54<span class="line"><span style="color:#908CAA"> }</span></span> 55<span class="line"><span style="color:#E0DEF4;font-style:italic"> require</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Equal</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">t</span><span style="color:#908CAA">,</span><span style="color:#EBBCBA"> classic</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">a</span><span style="color:#908CAA">),</span><span style="color:#E0DEF4;font-style:italic"> roll</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">
55Sum32</span><span style="color:#908CAA">())</span></span> 56<span class="line"></span> 57<span class="line"><span style="color:#908CAA;font-style:italic"> //</span><span style="color:#908caa;font-style:italic"> Testing the actual roll</span></span> 58<span class="line"><span style="color:#E0DEF4;font-style:italic"> roll</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Out</span><span style="color:#908CAA">()</span></span> 59<span class="line"><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#31748F"> =</span><span style="color:#E0DEF4;font-style:italic"> a</span><span style="color:#908CAA">[</span><span style="color:#EBBCBA">1</span><span style="color:#908CAA">:]</span></span> 60<span class="line"><span style="color:#E0DEF4;font-style:italic"> assert</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Equal</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">t</span><span style="color:#908CAA">,</span><span style="color:#EBBCBA"> classic</span><span style="color:#908CAA">(</span><span style="color:#E0DEF4;font-style:italic">a</span><span style="color:#908CAA">),</span><span style="color:#E0DEF4;font-style:italic"> roll</span><span style="color:#908CAA">.</span><span style="color:#EBBCBA">Sum32</span><span style="color:#908CAA">())</span></span> 61<span class="line"><span style="color:#908CAA">}</span></span></code></span><span class="code-theme-light"><code><span class="line"><span style="color:#286983">package</span><span style="color:#56949F"> rollsum</span></span> 62<span class="line"></span> 63<span class="line"><span style="color:#286983">import</span><span style="color:#797593"> (</span></span> 64<span class="line"><span style="color:#EA9D34"> "</span><span style="color:#D7827E">fmt</span><span style="color:#EA9D34">"</span></span> 65<span class="line"><span style="color:#EA9D34"> "</span><span style="color:#D7827E">
65hash/adler32</span><span style="color:#EA9D34">"</span></span> 66<span class="line"><span style="color:#EA9D34"> "</span><span style="color:#D7827E">testing</span><span style="color:#EA9D34">"</span></span> 67<span class="line"><span style="color:#EA9D34"> "</span><span style="color:#D7827E">github.com/stretchr/testify/assert</span><span style="color:#EA9D34">"</span></span> 68<span class="line"><span style="color:#EA9D34"> "</span><span style="color:#D7827E">github.com/stretchr/testify/require</span><span style="color:#EA9D34">"</span></span> 69<span class="line"><span style="color:#797593">)</span></span> 70<span class="line"></span> 71<span class="line"><span style="color:#286983">func</span><span style="color:#D7827E"> classic</span><span style="color:#797593">(</span><span style="color:#907AA9;font-style:italic">data</span><span style="color:#797593"> []</span><span style="color:#286983">byte</span><span style="color:#797593">)</span><span style="color:#286983"> uint32</span><span style="color:#797593"> {</span></span> 72<span class="line"><span style="color:#575279;font-style:italic"> a</span><span style="color:#286983"> :=</span><span style="color:#575279;font-style:italic"> adler32</span><span style="color:#797593">.</span><span style="color:#D7827E">New</span><span style="color:#797593">()</span></span> 73<span class="line"><span style="color:#575279;font-style:italic"> a</span><span style="color:#797593">.</span><span style="color:#D7827E">Write</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">data</span><span style="color:#797593">)</span></span> 74<span class="line"><span style="color:#286983"> return</span><span style="color:#575279;font-style:italic"> a</span><span style="color:#797593">.</span><span style="color:#D7827E">Sum32</span><span style="color:#797593">()</span></span> 75<span class="line"><span style="color:#797593">}</span></span> 76<span class="line"></span> 77<span class="line"><span style="color:#286983">func</span><span style="color:#D7827E"> TestRollInAndOut</span><span style="color:#797593">(</span><span style="color:#907AA9;font-style:italic">t</span><span style="color:#286983"> *</span><span style="color:#56949F">testing</span><span style="color:#797593">.</span><span style="color:#56949F">T</span><span style="color:#797593">)</span><span style="color:#797593"> {</span></span> 78<span class="line"><span style="color:#575279;font-style:italic"> a</span><span style="color:#286983"> :=</span><span style="color:#797593"> []</span><span style="color:#286983">byte</span><span style="color:#797593">(</span><span style="color:#EA9D34">"Adler-32 is a checksum"</span><span style="color:#797593">)</span></span> 79<span class="line"><span style="color:#575279;font-style:italic"> roll</span><span style="color:#286983"> :=</span><span style="color:#D7827E"> New</span><span style="color:#797593">(</span><span style="color:#D7827E">1</span><span style="color:#286983"> <<</span><span style="color:#D7827E"> 16</span><span style="color:#797593">)</span></span> 80<span class="line"><span style="color:#286983"> for</span><span style="color:#575279;font-style:italic"> _</span><span style="color:#797593">,</span><span style="color:#575279;font-style:italic"> x</span><span style="color:#286983"> :=</span><span style="color:#286983"> range</span><span style="color:#575279;font-style:italic"> a</span><span style="color:#797593"> {</span></span> 81<span class="line"><span style="color:#575279;font-style:italic"> roll</span><span style="color:#797593">.</span><span style="color:#D7827E">In</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">x</span><span style="color:#797593">)</span></span> 82<span class="line"><span style="color:#797593"> }</span></span> 83<span class="line"><span style="color:#575279;font-style:italic"> require</span><span style="color:#797593">.</span><span style="color:#D7827E">Equal</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">t</span><span style="color:#797593">,</span><span style="color:#D7827E"> classic</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">a</span><span style="color:#797593">),</span><span style="color:#575279;font-style:italic"> roll</span><span style="color:#797593">.</span><span style="color:#D7827E">
83Sum32</span><span style="color:#797593">())</span></span> 84<span class="line"></span> 85<span class="line"><span style="color:#797593;font-style:italic"> //</span><span style="color:#797593;font-style:italic"> Testing the actual roll</span></span> 86<span class="line"><span style="color:#575279;font-style:italic"> roll</span><span style="color:#797593">.</span><span style="color:#D7827E">Out</span><span style="color:#797593">()</span></span> 87<span class="line"><span style="color:#575279;font-style:italic"> a</span><span style="color:#286983"> =</span><span style="color:#575279;font-style:italic"> a</span><span style="color:#797593">[</span><span style="color:#D7827E">1</span><span style="color:#797593">:]</span></span> 88<span class="line"><span style="color:#575279;font-style:italic"> assert</span><span style="color:#797593">.</span><span style="color:#D7827E">Equal</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">t</span><span style="color:#797593">,</span><span style="color:#D7827E"> classic</span><span style="color:#797593">(</span><span style="color:#575279;font-style:italic">a</span><span style="color:#797593">),</span><span style="color:#575279;font-style:italic"> roll</span><span style="color:#797593">.</span><span style="color:#D7827E">Sum32</span><span style="color:#797593">())</span></span> 89<span class="line"><span style="color:#797593">}</span></span></code></span>`,!0),a(i),p(),a(y),E(A,e)}export{D as component};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.