Bài viết mới nhất

Tổng 2300 bài
Lập trình Go 22/09/2026 6 phút

Nén trong Go: compress/gzip, chọn mức, và nén luồng không nạp hết vào RAM

Go có nén tích hợp trong thư viện chuẩn: compress/gzip, flate, zlib. Bài này đo thật: gzip BestSpeed nén 10MB trong 19ms, BestCompression trong 437ms (nhỏ hơn chưa tới 0.5%). Và cách nén theo luồng bằng io.Copy qua gzip.Writer để nén file 10GB với bộ nhớ vài chục KB. Kèm cái bẫy quên Close() làm hỏng dữ liệu, và cách tái dùng Writer bằng sync.Pool.

Lập trình 22/09/2026 6 phút

Chọn thuật toán nén: khung quyết định theo bốn tiêu chí, và tổng kết cả loạt

Bài cuối loạt Nén: không có thuật toán nén tốt nhất, chỉ có tốt nhất cho ràng buộc của bạn. Bài này đo thật năm công cụ trên cùng 22MB — lz4 nén/giải nhanh nhất (32ms/9ms), xz nén chặt nhất (7.6x), zstd -19 vừa nhỏ vừa giải nhanh (7.3x, 16ms) — mỗi cái vô địch một tiêu chí khác. Kèm cây quyết định thực dụng và tổng kết 12 phần từ entropy tới chọn thuật toán.

Lập trình 22/09/2026 6 phút

Bloom filter: trả lời 'có trong tập không' bằng 1/46 bộ nhớ, đổi lại chút báo nhầm

Cần kiểm tra một phần tử có trong tập triệu phần tử không, mà không muốn tốn hàng chục MB? Bloom filter làm được bằng một mảng bit và vài hàm băm. Bài này tự cài Bloom và đo thật: thay 57MB set bằng 1.25MB (nhỏ hơn 46 lần), tỉ lệ báo nhầm thực tế 0.83% khớp gần như hoàn hảo công thức lý thuyết 0.82%, và không bao giờ báo sót. Cơ chế, công thức, và khi nào dùng.

Lập trình 22/09/2026 6 phút

Chọn m và k tối ưu cho Bloom filter: hai công thức và một cái bẫy chết người

Bloom filter chỉ tốt khi bạn cấp đúng số bit và đúng số hàm băm. Bài này đo thật: quét k từ 1 tới 15 cho thấy có một k tối ưu (7) cho tỉ lệ báo nhầm thấp nhất, nhiều hơn lại tệ hơn; công thức m = -n·ln(p)/(ln2)² cho đúng số bit để đạt 1%, 0.1%, 0.01%; và cái bẫy chết người — nhồi gấp đôi số phần tử dự kiến làm báo nhầm nhảy từ 0.8% lên 13.8%.

Lập trình 22/09/2026 7 phút

Counting Bloom filter: thêm khả năng xóa cho Bloom, và ba cái giá phải trả

Bloom filter thường không xóa được — tắt bit sẽ phá phần tử khác. Counting Bloom thay mỗi bit bằng một bộ đếm nhỏ để hỗ trợ xóa. Bài này tự cài và đo thật: xóa 'bob' làm nó biến mất mà 'alice' vẫn còn nguyên; nhưng cái giá là tốn 4 lần bộ nhớ, có rủi ro tràn bộ đếm, và xóa phần tử chưa từng thêm có thể sinh báo sót. Cơ chế và khi nào đáng dùng.

Lập trình 22/09/2026 7 phút

HyperLogLog: đếm một triệu phần tử khác nhau bằng 16KB, sai số 1%

Đếm 'bao nhiêu user duy nhất' hay 'bao nhiêu IP khác nhau' bằng set thì tốn RAM tỉ lệ số phần tử. HyperLogLog đếm số phần tử phân biệt bằng bộ nhớ CỐ ĐỊNH — bất kể 10 nghìn hay 1 triệu, vẫn 16KB. Bài này tự cài HLL và đo thật: đếm 1 triệu phần tử sai chỉ 1.06%, nhỏ hơn set 3479 lần. Trực giác về số 0 dẫn đầu, cơ chế register, và vì sao Redis dùng nó.