Loading Now

5 Ứng Dụng Thú Vị Của Hash Có Thể Bạn Chưa Biết!

Hash (băm dữ liệu) là thuật toán được sử dụng phổ biến trong khoa học máy tính phục vụ cho các mục đích khác nhau. Chính vì thế, hash được ứng dụng rất nhiều và có tầm ảnh hướng tương đối lớn. Để mở rộng tầm hiểu biết, hôm nay chúng mình sẽ cùng nhau tìm hiểu về “5 ứng dụng thú vị của hash” nhé!

Trước tiên, thì mình sẽ trả lời ngắn gọn “Hash là gì?” cái đã!

Hash là gì?

Hash là gì? Có ăn được không? Muốn biết rõ hơn về nó thì bạn có thể ghé qua bài viết này. 

Giờ mình sẽ tóm gọn lại như sau: “hash” dịch sang tiếng Việt là “băm”. Trong nấu ăn, để băm một cái gì đó thì chúng mình phải thực hiện hai thao tác là cắt và sau đó là trộn. Mình không rõ ai đó nghĩ ra hash có “đam mê” bếp núc gì không. Nhưng mà trong khoa học máy tính, thì hash cũng hoạt động tựa như vậy. 

a4c1828b341b74d4f5d272fdd7519c58

Giờ bạn có nhận ra cái dãy dài 32 ký tự trên kia là gì không? Và đáp án là mình đã sử dụng md5 hash để “băm” đoạn thông tin: “codelearn” thành một chuỗi thông tin mới. Giờ lại có một câu hỏi đặt ra là, chúng ta có thể hash những gì?

Câu trả lời của mình là: “Hãy cứ băm mọi thứ bạn có thể băm được

Chúng ta có thể tạo hash gần như mọi nội dung kỹ thuật số: tài liệu, hình ảnh, bài hát hoặc bất cứ thứ gì.

Top 5 ứng dụng thú vị của Hash

Như mình đã nói, trong khoa học máy tính, hash được sử dụng cho rất nhiều mục đích khác nhau. Tuy nhiên với phạm vi hiểu biết và tầm ảnh hướng của hash. Mình sẽ trình bày ứng dụng của nó trong: mật mã (cryptography), nén (compression), tạo tổng kiểm tra (checksum generation), lập chỉ mục dữ liệu (data indexing)… Chúng ta sẽ lần lượt đi tìm hiểu chi tiết về ứng dụng này nhé.

1. Che dấu dữ liệu gốc

Hash được sử dụng cho mật mã vì nó che dấu dữ liệu gốc bởi một giá trị khác. Vì sử dụng trong mật mã nên một “hàm băm tốt” là một hàm băm không thể đảo ngược. Mình sẽ lấy ví dụ của việc sử dụng hash trong xác minh mật khẩu. 

Khi lưu password trong cơ sở dữ liệu (database) người ta thường dùng kỹ thuật “password hashing” chứ không lưu trực tiếp password. Vì nếu database của chúng ta bị xâm phạm (bởi các lực lượng bên ngoài hoặc bên trong, bên trong ở đây có thể là chính người quản trị cơ sở dữ liệu, bên ngoài ở đây có thể là các hacker, kẻ phá hoại,…) thì tất cả các thông tin về user trong đó có password sẽ bị lộ. 

Thay về lưu password dưới dạng plaintext (dạng text bình thường mà con người có thể đọc hiểu được) thì password sẽ được đưa vào một hash function, hash value sinh ra từ hash function sẽ được dùng để lưu và database đại diện cho password. Bạn sẽ thấy rõ hơn mô hình này qua sơ đồ dưới đây

Cụ thể, nếu mình đăng ký tài khoản trên trang web với username là “PhamDat” và password là “12345678“, webserver sử dụng thuật toán hash để tính hash value của password và lưu xuống database. Giả sử, hash value của “12345678” là “25d55ad283aa400af464c76d713c07ad”

Lần sau, khi đăng nhập nếu mình nhập “12345678” trong ô password thì webserver sẽ lấy hash value của dữ liệu vừa nhập vào và so sánh với giá trị “25d55ad283aa400af464c76d713c07ad“ lưu trong database. Trường hợp hai giá trị hash bằng nhau thì mình đã đăng nhập thành công. Ngược lại, nếu mình lỡ tay nhập “123456789” thì có giá trị hash nhận được khi này sẽ là “25f9e794323b453885f5181f1b624d0b”. Rõ ràng, là mình đã nhập sai password rồi vì nó khác xa so với đoạn hash được lưu trong database.

2. Hashing trong định danh dữ liệu

a. Định danh tệp hoặc dữ liệu

Giá trị băm cũng có thể được sử dụng như một phương tiện để định danh tập tin một cách đáng tin cậy. Một số hệ thống quản lý mã nguồn, như Git, Mercurial hay Monotone, sử dụng giá trị sha1sum của nội dung tệp, cây thư mục, thông tin thư mục gốc, v.v. để định danh chúng. Những giá trị này còn được sử dụng để xác định các tệp trên các mạng chia sẻ ngang hàng nhằm cung cấp đầy đủ thông tin để định vị nguồn gốc của tệp, xác minh nội dung tệp tải xuống. Giá trị ứng dụng của chúng còn được mở rộng ra khi áp dụng các cấu trúc dữ liệu bổ sung như danh sách băm hoặc cây băm.

b. Tạo và xác nhận giá trị tổng kiếm hoặc chữ ký số

Checksum là giá trị tổng kiểm, được sử dụng với mục đích xác nhận tính toàn vẹn của file. Checksum là giá trị nhỏ được tạo dựa trên các bit trong một file hoặc khối dữ liệu như image đĩa. Khi chức năng checksum chạy trên một bản sao của file (chẳng hạn như file được tải từ Internet), nó sẽ tạo ra giá trị băm giống như file gốc. Nếu file không tạo cùng một checksum, có nghĩa là file đã bị thay đổi.

Ngoài ra, cũng giống như checksum, hash cũng được sử dụng trong tạo và xác nhận chữ ký số an toàn và hiệu quả.

 

3. Nén dữ liệu

Chắc hẳn, các bạn đã quen thuộc với các phần mềm nén. Nhưng mình tin là sẽ không nhiều bạn biết rằng, hash cũng có mặt trong đó. Vì tính chất “tạo ra dữ liệu với kích thước cố định từ một đầu vào bất kỳ” nên việc góp sức hash rõ ràng là một trong các phương thức để giảm kích thước file. Cụ thể, bằng cách hash đầu vào thành giá trị nhỏ, dữ liệu có thể được nén thành các phần nhỏ hơn. Tuy nhiên, do hash còn có một tính chất nữa đó là “tính một chiều” nên khi giải nén. Ta không thể đảo ngược để có được dữ liệu gốc nhưng có thể tái tạo lại dữ liệu gần bằng dữ liệu gốc.

4. Ứng dụng trong lập chỉ mục và truy xuất dữ liệu 

Một trong những ví dụ cụ thể mà mình biết đó là hashtable. Nếu bạn đã từng học lập trình thì hashtable được hỗ trợ trong rất nhiều các ngôn ngữ, là một trong những nền tảng về thuật toán và cấu trúc dữ liệu.

Cho các bạn chưa biết thì: hash table là một cấu trúc dữ liệu dùng để lưu theo các cặp key-value, nó dùng hash function để tính toán ra một index (nơi lưu trữ một bucket các giá trị) rồi từ đó sẽ retrieve ra value.

Giả sử mình có các object với data bất kỳ. Điều đầu tiên, khi đưa dữ liệu qua hash function thì lợi ích chúng ta có được là dữ liệu đầu ra được đồng bộ (đó là hash codes). Tuy nhiên, kích thước bảng vẫn còn lớn nên ta sẽ sử dụng kỹ thuật “Modulo table size” để giảm kích thước xuống và có được một hash table.

Nếu các bạn vẫn nhớ thì một trong những vấn đề của hash đó là “collision” (trùng vị trí index). Điều này sẽ xảy ra nếu thuật toán hash không được tốt. Và thực tế, hầu như không có thuật toán hash nào thực sự hoàn hảo để sinh ra unique key nếu lưu trữ một lượng lớn dữ liệu. Giải pháp cho vấn đề này là dùng linked list để lưu trữ thêm một tầng nữa các phần tử cho index đó.

Có thể coi việc sinh hash là để tạo keyHash và lưu vào trong mảng giá trị nơi chứa một linked list có phần tử chứa key thật, sau khi truy xuất tới đó chúng ta sẽ dùng key thật để retrieve giá trị.

Như vậy, việc sử dụng hashtable sẽ giúp tạo một chỉ mục nhỏ hơn nhiều so với dữ liệu gốc. Nhờ đó việc tìm kiếm và truy cập dữ liệu sẽ hiệu quả hơn.

5 Ứng dụng trong bằng chứng công việc (Proof of Work)

Proof of work ̣(PoW) là một biện pháp kinh tế để ngăn chặn các cuộc tấn công từ chối dịch vụ và các hành vi lạm dụng dịch vụ khác như spam bằng cách yêu cầu người dùng dịch vụ thực hiện một số công việc nhất định, thường đòi hỏi nhiều thời gian xử lý. Bằng chứng công việc cần đảm bảo tính bất đối xứng tức là: công việc phải có độ khó vừa phải (nhưng khả thi) về phía người dùng nhưng dễ kiểm chứng đối với nhà cung cấp dịch vụ.

PoW cũng là thuật toán đồng thuận đầu tiên được tạo ra trong mạng Blockchain. Được sử dụng để xác nhận giao dịch và sản xuất các block mới trong chuỗi.

PoW yêu cầu những người sở hữu các máy tính trong mạng phải giải một bài toán phức tạp để có thể thêm một block (khối) vào chuỗi. Tuy nhiên, không dễ để có câu trả lời cho vấn đề toán học. Các bạn có thể hình dung mô hình hoạt động qua hình sau:

Nguồn: VnReview.vn

Tài liệu tham khảo

Post Comment

Contact