Hash Code và Checksum - sự khác biệt là gì?


115

Tôi hiểu rằng mã băm và tổng kiểm tra là những thứ tương tự nhau - một giá trị số, được tính cho một khối dữ liệu, tương đối duy nhất.

tức là Xác suất hai khối dữ liệu mang lại cùng một giá trị băm / tổng kiểm tra số đủ thấp để có thể bỏ qua nó cho các mục đích của ứng dụng.

Vì vậy, chúng ta có hai từ cho cùng một thứ, hay có sự khác biệt quan trọng giữa mã băm và tổng kiểm tra?


3
Tóm tắt các câu trả lời bên dưới: Mã băm giảm đầu vào xuống một số nhỏ, theo cách giảm thiểu cơ hội va chạm. Mặt khác, tổng kiểm tra giảm đầu vào xuống một số nhỏ, theo cách giảm thiểu cơ hội va chạm. Bạn có thể làm cho một âm thanh khác với âm thanh kia bằng cách tùy ý diễn đạt lại mô tả đó.
Dan Stahlke

3
@DanStahlke - Không, đó không phải là những gì câu trả lời bên dưới nói. Có, cả hai đều giảm đầu vào xuống một số lượng nhỏ hơn. Nhưng có rất nhiều, rất nhiều cách để làm như vậy, làm thế nào để lựa chọn thuật toán để sử dụng? Điều đó phụ thuộc vào mục tiêu của bạn. Để tóm tắt hai câu trả lời hàng đầu: mục tiêu của tổng kiểm tra là " phát hiện các lỗi phổ biến nhất ". Chọn một thuật toán tạo ra một tổng kiểm tra khác, cho bất kỳ lỗi nào là "phổ biến nhất" trong kịch bản của bạn. Nếu bạn lo lắng về việc một hoặc hai bit được chuyển đổi, bạn có thể chọn một thuật toán đảm bảo phát hiện ra lỗi cụ thể đó! Đây là một sự đánh đổi rất cụ thể.
ToolmakerSteve

1
@DanStahlke - mặt khác, mã băm bao gồm một loạt các đánh đổi có thể có. Nếu chúng ta muốn nói đến một giá trị được sử dụng trong việc tạo bảng băm, thì chúng ta biết rằng sẽ có rất nhiều va chạm. Đây là một sự đánh đổi rất khác (so với tổng kiểm tra). Chúng tôi đang cố gắng giảm va chạm ở mức trung bình . Chúng tôi không đảm bảo bất cứ điều gì. Có thể có một số đầu vào chỉ khác nhau một bit, nhưng mang lại cùng một hàm băm. Điều này hoàn toàn ổn, nếu trung bình, chúng ta nhận được một mức chênh lệch giá trị băm tốt. Tuy nhiên, sẽ không thể chấp nhận được đối với một tổng kiểm tra.
ToolmakerSteve

Câu trả lời:


72

Tôi sẽ nói rằng một tổng kiểm tra nhất thiết phải là một mã băm . Tuy nhiên, không phải tất cả các mã băm đều tạo ra tổng kiểm tra tốt.

Tổng kiểm tra có một mục đích đặc biệt --- nó xác minh hoặc kiểm tra tính toàn vẹn của dữ liệu (một số có thể vượt ra ngoài điều đó bằng cách cho phép sửa lỗi ). Tổng kiểm tra "tốt" rất dễ tính toán và có thể phát hiện nhiều loại lỗi dữ liệu (ví dụ: một, hai, ba bit sai).

Mã băm chỉ đơn giản là mô tả một hàm toán học ánh xạ dữ liệu đến một giá trị nào đó. Khi được sử dụng làm phương tiện lập chỉ mục trong cấu trúc dữ liệu (ví dụ bảng băm), xác suất va chạm thấp là mong muốn.


6
Có thể một cái có thể được sử dụng như cái kia, nhưng xem xét rằng chúng có các mục tiêu thiết kế khác nhau, điều này chỉ làm nhầm lẫn vấn đề.
Wim Coenen

8
@gumbo: không, không phải mọi mã băm đều là tổng kiểm tra. Xem ví dụ chuỗi từ MSalters bên dưới.
MarcH

41

Có một mục đích khác nhau đằng sau mỗi chúng:

  • Mã băm - được thiết kế để ngẫu nhiên trên miền của nó (để giảm thiểu xung đột trong bảng băm và những thứ tương tự). Mã băm mật mã cũng được thiết kế để không thể đảo ngược về mặt tính toán.
  • Kiểm tra tổng - được thiết kế để phát hiện các lỗi phổ biến nhất trong dữ liệu và thường để tính toán nhanh (để tổng kiểm tra hiệu quả các luồng dữ liệu nhanh).

Trong thực tế, các chức năng giống nhau thường tốt cho cả hai mục đích. Đặc biệt, một mã băm mạnh về mặt mật mã là một tổng kiểm tra tốt (hầu như không thể xảy ra lỗi ngẫu nhiên làm hỏng một hàm băm mạnh), nếu bạn có đủ khả năng chi phí tính toán.


1
Ngoài ra, thật tốt khi đề cập rằng phiên bản không mã hóa của mã băm có thể cung cấp sự cân bằng tốt giữa thời gian tính toán (gần với CRC) và phát hiện lỗi, cho dù đó là lỗi cố ý hay chỉ là lỗi giao tiếp / lỗi bit (CRC không thể được mong đợi để phát hiện giả mạo cố ý vì nó tương đối dễ dàng để cố ý thiết kế một vụ va chạm).
phóng khoáng

1
Đối với tôi, cụm từ quan trọng trong câu trả lời của bạn, đó là tổng kiểm tra được thiết kế để phát hiện các lỗi phổ biến nhất . Vâng, đó là nó. nó là một thuật toán băm đã được chọn để mang lại các giá trị khác nhau cho các dữ liệu có thể bị hỏng. Đó là một mục đích cụ thể và dẫn đến các thuật toán cụ thể, tối ưu hóa cho mục đích đó - tùy thuộc vào các loại nhiễu mà người ta lo ngại.
ToolmakerSteve

22

Thực sự có một số khác biệt:

  • Các tổng kiểm tra chỉ cần khác nhau khi đầu vào khác nhau (thường xuyên nhất có thể), nhưng điều quan trọng là chúng được tính toán nhanh.
  • Mã băm (để sử dụng trong bảng băm) có các yêu cầu giống nhau và ngoài ra, chúng phải được phân bổ đồng đều trên không gian mã, đặc biệt là đối với các đầu vào tương tự.
  • Băm mật mã có nhiều yêu cầu nghiêm ngặt hơn mà đưa ra một băm, bạn không thể xây dựng một đầu vào sản xuất băm này. Thời gian tính toán đứng thứ hai, và tùy thuộc vào ứng dụng, nó thậm chí có thể được mong muốn để băm được tính toán rất chậm (để chống lại các cuộc tấn công bạo lực).

1
Tôi không nghĩ tổng kiểm tra khác nhau cho các đầu vào khác nhau có bất kỳ lợi ích nào. Chúng chỉ để kiểm tra tính toàn vẹn, không phải để băm.
user541686

1
@Mehrdad: vậy làm cách nào để bạn đề xuất kiểm tra tính toàn vẹn mà không nhận được các kết quả khác nhau cho các đầu vào khác nhau?
Michael Borgwardt

Er, có lẽ tôi đã nói sai những gì tôi đã nói? Tôi đang đề cập đến phần mà bạn nói "càng xa càng tốt" - Tôi chỉ nói rằng không có lý do gì để chúng không thể đoán trước hoặc "xa" như hàm băm. Miễn là có một số thay đổi trong tổng kiểm tra khi đầu vào trải qua một thay đổi điển hình, đó là một tổng kiểm tra tốt. Ngược lại điều đó với hàm băm, cũng có mục tiêu phân phối mọi thứ đồng đều / ngẫu nhiên / không thể đoán trước / "xa" nhất có thể vào tên miền của chúng.
user541686

Tôi nghĩ rằng bạn đã hiểu sai ý tôi với "càng xa càng tốt" - tôi chỉ muốn nói rằng va chạm nên càng hiếm càng tốt, mặc dù tất nhiên là không thể tránh khỏi. Tôi sẽ thay đổi từ ngữ.
Michael Borgwardt

@Mehrdad - lúc đầu điều đó không có ý nghĩa gì đối với tôi. Nếu một tổng kiểm tra không có phân phối tốt trên các giá trị tổng kiểm tra có thể có, điều đó có nghĩa là có một số giá trị tổng kiểm tra được trả về cho nhiều giá trị đầu vào hơn (so với các tổng kiểm tra khác). Nhưng, điều đó làm giảm tính hữu ích của tổng kiểm tra? [Nó làm tăng khả năng dữ liệu bị xáo trộn sẽ trả về cùng một kết quả, đúng không?] Hmm, tôi sai, bạn đúng: tổng kiểm tra chỉ có khả năng phát hiện nhiễu tốt. Điều đó có thể không yêu cầu phân phối đồng đều trên tất cả các giá trị.
ToolmakerSteve

10

Mã băm và tổng kiểm tra đều được sử dụng để tạo giá trị số ngắn từ một mục dữ liệu. Sự khác biệt là giá trị tổng kiểm tra sẽ thay đổi, ngay cả khi một sửa đổi nhỏ được thực hiện đối với mục dữ liệu. Đối với giá trị băm, yêu cầu đơn thuần là các mục dữ liệu trong thế giới thực phải có giá trị băm riêng biệt.

Một ví dụ rõ ràng là các chuỗi. Tổng kiểm tra cho một chuỗi phải bao gồm từng bit và thứ tự quan trọng. Mặt khác, mã băm thường có thể được triển khai dưới dạng tổng kiểm tra của tiền tố có độ dài giới hạn. Điều đó có nghĩa là "aaaaaaaaaaba" sẽ băm giống như "aaaaaaaaaaab", nhưng các thuật toán băm có thể giải quyết những va chạm như vậy.


Câu trả lời này là một trong những rung chuông cho tôi. Vì vậy, tính toàn vẹn của dữ liệu không phải là trọng tâm của hàm băm.
truthadjustr

9

Wikipedia đặt nó tốt:

Các hàm kiểm tra có liên quan đến hàm băm, dấu vân tay, hàm ngẫu nhiên và hàm băm mật mã. Tuy nhiên, mỗi khái niệm đó có các ứng dụng khác nhau và do đó mục tiêu thiết kế khác nhau. Số kiểm tra và bit chẵn lẻ là các trường hợp đặc biệt của tổng kiểm tra, thích hợp cho các khối dữ liệu nhỏ (chẳng hạn như số An sinh xã hội, số tài khoản ngân hàng, từ máy tính, byte đơn, v.v.). Một số mã sửa lỗi dựa trên tổng kiểm tra đặc biệt không chỉ phát hiện các lỗi thông thường mà còn cho phép khôi phục dữ liệu gốc trong một số trường hợp nhất định.


28
Sau khi đọc xong, tôi vẫn tự hỏi sự khác biệt là gì.
kirk.burleson

@ kirk.burleson - Tôi có thể nói rằng chúng có cùng một nguyên tắc , nhưng trong thực tế, người ta luôn đánh đổi . Trong các tình huống khác nhau, sự cân bằng khác nhau được áp dụng, vì vậy các phương pháp tiếp cận khác nhau được sử dụng. Không hẳn là một lời biện minh cho việc có hai từ khác nhau, chỉ nói rằng nếu bạn tìm kiếm các kỹ thuật tốt cho tổng kiểm tra, bạn có thể tìm thấy một bộ thuật toán khác với khi tìm kiếm mã băm.
ToolmakerSteve

5

Tổng kiểm tra bảo vệ khỏi những thay đổi ngẫu nhiên.

Một hàm băm mật mã bảo vệ chống lại kẻ tấn công có động cơ.

Khi bạn gửi các bit trên dây, có thể vô tình xảy ra trường hợp một số bit bị lật, bị xóa hoặc bị chèn. Để cho phép người nhận phát hiện (hoặc đôi khi sửa chữa) các tai nạn như thế này, người gửi sử dụng tổng kiểm tra.

Nhưng nếu bạn giả sử rằng có ai đó đang chủ động và thông minh sửa đổi thông điệp trên dây và bạn muốn bảo vệ khỏi loại kẻ tấn công này, thì hãy sử dụng hàm băm mật mã (Tôi đang bỏ qua việc ký mã hóa bằng mã băm hoặc sử dụng kênh phụ hoặc tương tự, vì câu hỏi dường như không tránh khỏi điều này).


3
"hash mật mã" làm tăng sự nhầm lẫn giữa "hash" và "checksum". "tổng kiểm tra mật mã" tốt hơn vì nó không.
MarcH

5

Mặc dù băm và tổng kiểm tra giống nhau ở chỗ cả hai đều tạo ra một giá trị dựa trên nội dung của tệp, nhưng việc băm không giống như tạo tổng kiểm tra. Tổng kiểm tra nhằm xác minh (kiểm tra) tính toàn vẹn của dữ liệu và xác định các lỗi truyền dữ liệu, trong khi hàm băm được thiết kế để tạo ra một dấu vân tay kỹ thuật số duy nhất của dữ liệu.

Nguồn: CompTIA ® Security + Hướng dẫn các nguyên tắc cơ bản về an ninh mạng - Ấn bản thứ năm - Mark Ciampa -Trang 191


4

Ngày nay, chúng có thể hoán đổi cho nhau, nhưng trong những ngày trước đây, tổng kiểm tra là một công việc rất đơn giản, nơi bạn sẽ thêm tất cả dữ liệu lên (thường tính bằng byte) và gắn một byte vào cuối với giá trị đó bằng .. thì bạn hy vọng biết nếu bất kỳ dữ liệu ban đầu đã bị hỏng. Tương tự như một bit kiểm tra, nhưng với byte.


4

Sự khác biệt giữa mã băm và các hàm tổng kiểm tra là, chúng được thiết kế cho các mục đích khác nhau.

  • Tổng kiểm tra được sử dụng để tìm hiểu xem có điều gì đó trong đầu vào đã thay đổi hay không.

  • Mã băm được sử dụng để tìm hiểu xem có điều gì đó trong đầu vào đã thay đổi hay không và có càng nhiều "khoảng cách" giữa các giá trị mã băm riêng lẻ càng tốt.

    Ngoài ra, có thể có các yêu cầu khác đối với hàm băm, trái ngược với quy tắc này, như khả năng tạo cây / cụm / nhóm các giá trị mã băm sớm.

    Và nếu bạn thêm một số ngẫu nhiên ban đầu được chia sẻ, bạn sẽ có khái niệm về mã hóa / trao đổi khóa hiện đại.


Về xác suất:

Ví dụ: giả sử rằng dữ liệu đầu vào thực sự luôn thay đổi (100% thời gian). Và giả sử bạn có một hàm băm / tổng kiểm tra "hoàn hảo", tạo ra một giá trị băm / tổng kiểm tra 1 bit. Do đó, bạn sẽ nhận được các giá trị băm / tổng kiểm tra khác nhau, 50% thời gian, cho dữ liệu đầu vào ngẫu nhiên.

  • Nếu chính xác 1 bit trong dữ liệu đầu vào ngẫu nhiên của bạn đã thay đổi, bạn sẽ có thể phát hiện 100% thời gian đó, bất kể dữ liệu đầu vào lớn đến mức nào.

  • Nếu 2 bit trong dữ liệu đầu vào ngẫu nhiên của bạn đã thay đổi, xác suất phát hiện "thay đổi" của bạn sẽ chia cho 2, vì cả hai thay đổi có thể vô hiệu hóa lẫn nhau và không có hàm băm / tổng kiểm tra nào phát hiện ra rằng 2 bit thực sự khác nhau trong dữ liệu đầu vào .

    ...

Điều này có nghĩa là, Nếu số lượng bit trong dữ liệu đầu vào của bạn lớn hơn nhiều lần so với số lượng bit trong giá trị băm / tổng kiểm, xác suất của bạn thực sự nhận được các giá trị băm / tổng kiểm tra khác nhau, đối với các giá trị đầu vào khác nhau, sẽ giảm xuống và không phải là không đổi .


2

Tôi có xu hướng sử dụng từ checksum khi đề cập đến mã (số hoặc cách khác) được tạo cho một tệp hoặc phần dữ liệu có thể được sử dụng để kiểm tra xem tệp hoặc dữ liệu đó có bị hỏng hay không. Cách sử dụng phổ biến nhất mà tôi gặp là kiểm tra xem các tệp được gửi qua mạng không bị thay đổi (cố ý hay khác).


1
Bởi vì tổng tổng kiểm tra không khó để đảo ngược, điều này cho thấy rằng chúng sẽ không tốt cho việc kiểm tra xem có điều gì đó đã được cố tình thay đổi hay không.
benblasdell 17/10/12

0

Trong phân tích dữ liệu cụm Redis, nó sử dụng a hash slotđể quyết định nút nào nó đi. Lấy ví dụ về hoạt động modulo dưới đây:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

Xuất 6hiện hai lần trên các đầu vào khác nhau. Mục đích của băm đơn giản là ánh xạ giá trị đầu vào thành giá trị đầu ra và tính duy nhất không phải là một phần của thỏa thuận. Vì vậy, hai đầu vào khác nhau tạo ra cùng một đầu ra là điều tốt trong thế giới băm.

Mặt khác, tổng kiểm tra phải khác đầu ra ngay cả khi một bit trong đầu vào thay đổi vì mục đích của nó không phải là ánh xạ mà là để phát hiện hỏng dữ liệu. Vì vậy, hai đầu vào khác nhau tạo ra cùng một đầu ra không được chấp nhận trong một tổng kiểm tra.


-4

Tổng tổng kiểm tra chỉ đơn giản là một số được tạo ra từ trường dữ liệu bằng cách oring (bằng phép cộng logic do đó tính tổng). Tổng kiểm tra có khả năng phát hiện sự hỏng hóc của bất kỳ bit nào hoặc số lượng bit nào trong trường dữ liệu mà nó được tạo ra, tức là nó kiểm tra tất cả các lỗi, nó không thể sửa chúng. Tổng kiểm tra là một hàm băm vì kích thước của tổng kiểm tra nhỏ hơn dữ liệu ban đầu. Có, bạn sẽ có xung đột vì tổng kiểm tra không nhạy cảm với vị trí bit trong trường dữ liệu.

Kiểm tra dự phòng theo chu kỳ (CRC) là một cái gì đó khá khác, phức tạp hơn và KHÔNG được gọi là tổng kiểm tra. Nó là ứng dụng của một chuỗi đa thức có khả năng sửa bất kỳ số lượng bit bị hỏng riêng lẻ nào đã chọn trong trường dữ liệu mà từ đó nó được tạo ra. Việc tạo CRC dẫn đến một số có kích thước lớn hơn trường dữ liệu ban đầu (không giống như tổng kiểm tra) - do đó tên bao gồm từ "dự phòng" và cái giá bạn phải trả cho khả năng sửa lỗi. CRC do đó KHÔNG phải là một hàm băm và không được nhầm lẫn hoặc được đặt tên là tổng kiểm tra, bởi vì phần dư thừa nhất thiết phải tăng thêm kích thước của dữ liệu gốc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.