Sketch Lab
Lab interaktif untuk empat struktur data probabilistik, dengan jawaban pasti berjalan di sampingnya untuk menunjukkan setiap galat

- struktur dibuat dari makalah aslinya
- 4
- setiap angka memori diukur, bukan diperkirakan
- Byte asli
- dependensi runtime, tanpa library sketch
- 3
Di halaman ini
Masalahnya
Hampir semua backend engineer pernah mendengar Bloom filter, Count-Min sketch, dan HyperLogLog. Sedikit yang yakin memakainya. Struktur data ini menjawab pertanyaan tentang data yang sangat besar dengan memori yang kecil dan tetap: database yang melewatkan pembacaan disk, CDN yang menghitung pengunjung unik, atau stream processor yang mencari item paling sering muncul. Makalahnya padat, dan kebanyakan tulisan blog menyederhanakan satu hal yang paling penting. Galatnya hanya ke satu arah dan bisa dihitung sebelumnya. Jawaban "tidak" dari Bloom filter itu pasti. Jawaban "ya"-nya hanya kemungkinan.
Tidak ada yang mau memakai struktur perkiraan yang tidak bisa diperiksa. Saya membangun Sketch Lab untuk dua kelompok: engineer yang perlu menentukan ukuran struktur ini untuk sistem produksi, dan engineer yang perlu melihatnya bekerja sebelum memercayainya.
Yang saya bangun
Jawaban pasti berjalan di samping jawaban perkiraan
Setiap stream diproses oleh sketch dan oleh set atau map biasa yang pasti pada saat yang sama. Halaman menandai setiap false positive begitu terjadi, lengkap dengan item dan slot yang bertabrakan. Kontrol utamanya adalah slider memori. Geser memori ke bawah, dan dua kurva bergerak bersama: galat yang diprediksi rumus dan galat yang diukur dari stream.
Memori diukur dalam byte yang sebenarnya
Perbandingan dengan struktur pasti hanya bermakna kalau angkanya benar. Karena itu setiap angka memori adalah ukuran array yang dialokasikan sebenarnya, bukan hasil rumus yang disajikan sebagai pengukuran. Kalkulator menerima jumlah item dan target galat, lalu mengembalikan ukuran, rumus, dan memorinya dalam byte. Layar inilah yang membuatnya bisa dipakai untuk pekerjaan sehari-hari.
Hash dan strukturnya saya tulis sendiri
Keempat struktur dibuat dari makalah aslinya: Bloom (1970), Count-Min (2005), HyperLogLog (2007), dan Cuckoo filter yang mendukung penghapusan. Fungsi hash-nya juga saya tulis sendiri. Setiap jaminan galat mengandaikan hash yang baik, dan hash yang buruk merusak semuanya tanpa suara. Tes hash berjalan paling awal di pipeline build, dan tidak ada yang berjalan kalau tes itu gagal.
Jaminan dan peluang diuji terpisah
"Bloom filter tidak pernah menjawab tidak untuk item yang sudah dimasukkan" adalah aturan, dan saya mengujinya tanpa toleransi. "Tingkat galat tetap di dalam batas prediksi" adalah peluang, diuji dengan seed tetap, banyak percobaan, dan toleransi yang ditulis jelas. Pemisahan ini mencegah orang menambahkan kelonggaran pada aturan yang tidak boleh longgar. Setiap percobaan memakai seed, jadi masukan yang sama memberi hasil yang sama di mesin mana pun.
Saat tes gagal, modelnya yang saya perbaiki
Satu tes gagal dengan galat sekitar 2.500 kali angka di buku teks. Saya menelusurinya ke efek struktural dari metode hash-nya, yang muncul saat filter diberi memori jauh lebih besar dari yang dibutuhkan. Saya menambahkan suku yang hilang ke model dan tidak menyentuh toleransinya. Pemeriksaan berikutnya menunjukkan Cuckoo filter ini memakai memori lebih besar daripada Bloom filter di setiap tingkat galat. Jadi halaman menawarkannya untuk fitur penghapusan, tanpa klaim soal hemat memori.
Hasilnya
Sketch Lab sudah live, terbuka untuk umum, tersedia dalam bahasa Inggris dan Indonesia, dan bisa dipakai offline setelah dimuat pertama kali. Isinya empat struktur ditambah pembanding pasti, pengecekan penggabungan sketch, serta stream seragam, miring, adversarial, dan teks. Setiap pengaturan bisa dibagikan sebagai link. Semua milestone di rencana selesai, termasuk Cuckoo filter yang opsional. Saya membangunnya dalam satu hari, 6 Agustus 2026, dengan tiga dependensi runtime. Ini alat belajar, bukan library produksi, dan memang itu rencananya sejak awal.
Di balik layarDetail teknis untuk engineer
- MurmurHash3 32-bit dengan penurunan k-hash Kirsch-Mitzenmacher, ditulis manual. Suite hash mencakup avalanche, chi-squared, dan known vector, dan menjadi job pertama dari lima job CI berurutan: hash gate → absolute → bounds/merge → build → deploy.
lib/pdsdanlib/hashmurni: typed array masuk, typed array keluar, tanpa DOM, jam, atau state modul. Kode yang sama berjalan di browser dan di Node saat tes. PRNG ber-seed memakai sfc32, tanpaMath.randomtanpa seed dilib/.tests/absolute/tidak mengizinkan toleransi.tests/bounds/menguji jumlah kejadian dengan ekor Poisson, karena pita normal di sekitar rata-rata di bawah satu (λ = 0,05) gagal hanya karena satu kejadian biasa.- Lantai kebetulan: pada
m=65536, k=8, n=500, slot berpola deret aritmetika dari Kirsch-Mitzenmacher membuat satu item yang sudah dimasukkan bisa mengisi semua k slot sebuah probe. Lantai yang diturunkan adalah(4n/m²)·(1+f)/(1−f)dan kini cocok dengan pengukuran (commitcb8c860). - Memaksa bit terendah
h₂bernilai 1 benar untuk Bloom, tetapi membuat Cuckoo filter hanya punya 2^(f−1) fingerprint, terukur tepat 2,0× batasnya. Diperbaiki dengan menggeser melewati bit yang dipaksa (c08fb0a). - Stream Zipfian menggagalkan 906 dari 2.000 insert Cuckoo pada muatan 27%; paling banyak 2b salinan satu item yang muat. Kondisi ini dan false negative akibat penghapusan sama-sama diuji harus terjadi. Titik silang Bloom-vs-Cuckoo ada di ε ≈ 0,2%, bukan 3% yang sering dikutip, karena angka itu milik varian semi-sorted.
- Penggabungan: Bloom memakai OR, HyperLogLog mengambil maksimum per register, Count-Min menjumlahkan. Setiap gabungan dicek terhadap sketch dari stream yang disambung. HyperLogLog mencakup rezim linear counting untuk rentang kecil.
- Proses panjang dijalankan di Web Worker dengan
ArrayBufferyang ditransfer. Bit array digambar di Canvas, kurva galat di SVG; di atas ambang ukuran tertentu bit digambar sebagai kepadatan blok dan UI menyebutkannya. - Warna brass awalnya hanya 2,84:1; saya menggelapkannya sampai kontrasnya sama persis dengan hijau truth (5,16 / 5,55 / 4,62).
upload-pages-artifactv4 membuang.nojekyll, jadi versi Actions kini dinaikkan satu major setiap kali. - Static export Next.js 14, 7 rute × 2 bahasa, 87,3 kB JS first-load bersama. 328 assertion di 13 berkas. Sekitar 11.900 baris TypeScript, 38 commit dalam kurang lebih 12 jam.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.