PageSourceSearch

https://iampavel.dev/_app/immutable/nodes/56.CskANURQ.js

js iampavel.dev collected 2026-10-08 12:37:27 UTC 30,054 bytes, 89 lines download raw bytes

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"> &#123;</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"> &#123;</span></span>
5<span class="line"><span style="color:#31748F">        return</span></span>
6<span class="line"><span style="color:#908CAA">    &#125;</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">&#125;</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"> &#123;</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"> &#123;</span></span>
15<span class="line"><span style="color:#286983">        return</span></span>
16<span class="line"><span style="color:#797593">    &#125;</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">&#125;</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"> &#123;</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">&#125;</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"> &#123;</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">&#125;</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"> &#123;</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">&#125;</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"> &#123;</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"> &#x3C;&#x3C;</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"> &#123;</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">	&#125;</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">&#125;</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"> &#123;</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">&#125;</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"> &#123;</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"> &#x3C;&#x3C;</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"> &#123;</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">	&#125;</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">&#125;</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.