Chính xác (và chính xác) là gì băm?


38

Tôi đã nghe thấy từ "băm" đang được sử dụng trong các bối cảnh khác nhau (tất cả trong thế giới điện toán) với các ý nghĩa khác nhau. Ví dụ, trong cuốn sách Tìm hiểu Python theo cách khó, trong chương về từ điển có nói "Python gọi chúng là" dicts. "Các ngôn ngữ khác gọi chúng là" băm ".

Cách sử dụng phổ biến khác của từ này liên quan đến mã hóa. Tôi cũng đã nghe (& đọc) những người sử dụng từ "băm" như một chức năng cụ thể trong chương trình cấp cao.

Vì vậy, chính xác nó là gì?

Bất cứ ai (với thời gian và người có kiến ​​thức) có thể vui lòng giải thích các nitty-gritties của "băm (hoặc băm)?"


8
Wikipedia có các bài viết chi tiết về bảng bămhàm băm mật mã . Bạn đang tìm kiếm cái gì không có trong đó?
David Richerby

1
Bạn đã liệt kê nhiều cách sử dụng thuật ngữ "băm" và có nhiều hơn nữa. Vì vậy, làm thế nào chính xác mà bạn mong đợi để có được một câu trả lời cho "chính xác nó là gì?"
Raphael

4
"Băm" theo nghĩa này là rút ngắn "Bảng băm", ví dụ: bảng sử dụng băm để tổ chức các khóa. Nó giống như gọi xăng là "gas" - bạn không mong đợi "gas" là khí hay khí có đặc tính giống xăng, phải không? Điều này xảy ra mọi lúc với ngôn ngữ - đặc biệt là rút ngắn là những nguồn trùng lặp từ rất phổ biến.
Luaan

1
"Không có định nghĩa cho từ này - không ai biết băm là gì." - Từ điển của quỷ
jpmc26

Các dòng suy nghĩ khác nhau về chức năng băm là gì: một hàm băm chỉ là một số chức năng với một loạt các thuộc tính, nhưng nó không được định nghĩa như thế nào có liên quan, đó là những tính chất mà chúng ta muốn có - mà chúng ta xuất phát từ cách chúng ta muốn để sử dụng chức năng - có liên quan. Bởi vì chúng tôi muốn sử dụng nó để truy cập công cụ một cách nhanh chóng, chúng tôi muốn nó có thể tính toán hiệu quả. Bởi vì chúng tôi không có không gian vô hạn có sẵn, chúng tôi muốn tên miền là hữu hạn. Vì chúng tôi muốn tránh va chạm càng tốt càng tốt, chúng tôi muốn hàm băm lan truyền băm đều.
G. Bach

Câu trả lời:


44

Bài viết Wikipedia về các hàm băm là rất tốt, nhưng tôi sẽ đưa ra đây.


Băm là gì?

"Hash" thực sự là một thuật ngữ rộng với các ý nghĩa chính thức khác nhau trong các bối cảnh khác nhau. Không có một câu trả lời hoàn hảo cho câu hỏi của bạn. Tôi sẽ giải thích khái niệm cơ bản chung và đề cập đến một số cách sử dụng phổ biến nhất của thuật ngữ này.

"Băm" là một hàm được gọi là hàm băm lấy làm đối tượng đầu vào và xuất ra một chuỗi hoặc số. Các đối tượng đầu vào thường là thành viên của các kiểu dữ liệu cơ bản như chuỗi, số nguyên hoặc lớn hơn bao gồm các đối tượng khác như cấu trúc do người dùng xác định. Đầu ra thường là một số hoặc một chuỗi. Danh từ "băm" thường dùng để chỉ đầu ra này. Động từ "băm" thường có nghĩa là "áp dụng hàm băm". Các thuộc tính chính mà hàm băm nên có là:h

  1. Nó phải dễ dàng để tính toán và
  2. Các đầu ra nên tương đối nhỏ.

Thí dụ:

Giả sử chúng tôi muốn băm số trong phạm vi từ 0 đến 999.999.999 đến số từ 0 đến 99. Một hàm băm đơn giản có thể là .h(x)= =xmod100

Thuộc tính bổ sung phổ biến:

Tùy thuộc vào trường hợp sử dụng, chúng ta có thể muốn hàm băm thỏa mãn các thuộc tính bổ sung. Dưới đây là một số thuộc tính bổ sung phổ biến:

  1. Tính đồng nhất : Thông thường chúng ta muốn băm của các đối tượng là khác biệt. Hơn nữa, chúng tôi có thể muốn băm được "trải ra". Nếu tôi muốn băm một số đối tượng thành 100 nhóm (vì vậy đầu ra của hàm băm của tôi là một số từ 0-99), thì tôi thường hy vọng rằng khoảng 1/100 đối tượng sẽ hạ cánh trong nhóm 0, khoảng 1/100 đất ở xô 1, v.v.

  2. Khả năng chống va chạm mật mã : Đôi khi, điều này được thực hiện thậm chí xa hơn, ví dụ, trong mật mã tôi có thể muốn một hàm băm sao cho đối thủ khó tìm ra hai đầu vào khác nhau ánh xạ tới cùng một đầu ra.

  3. Nén : Tôi thường muốn băm tùy ý - các đầu vào lớn xuống thành đầu ra có kích thước không đổi hoặc số lượng thùng cố định.

  4. Xác định : Tôi có thể muốn một hàm băm có đầu ra không thay đổi giữa các lần chạy, tức là đầu ra của hàm băm trên cùng một đối tượng sẽ luôn giữ nguyên. Điều này có vẻ mâu thuẫn với tính đồng nhất ở trên, nhưng một giải pháp là chọn ngẫu nhiên hàm băm một lần và không thay đổi nó giữa các lần chạy.


Một số ứng dụng

Một ứng dụng phổ biến là trong các cấu trúc dữ liệu như bảng băm, đó là một cách để thực hiện từ điển. Ở đây, bạn phân bổ một số bộ nhớ, giả sử, 100 "xô"; sau đó, khi được yêu cầu lưu trữ một cặp (khóa, giá trị) trong từ điển, bạn băm khóa vào số 0-99 và lưu trữ cặp đó vào nhóm tương ứng trong bộ nhớ. Sau đó, khi bạn được yêu cầu tra cứu một khóa, bạn băm khóa đó thành một số 0-99 với cùng hàm băm và kiểm tra cái xô đó để xem khóa đó có ở đó không. Nếu vậy, bạn trả lại giá trị của nó.

Lưu ý rằng bạn cũng có thể triển khai từ điển theo những cách khác, chẳng hạn như với cây tìm kiếm nhị phân (nếu các đối tượng của bạn có thể so sánh được).

Một ứng dụng thực tế khác là tổng kiểm tra, đó là những cách để kiểm tra hai tệp giống nhau (ví dụ: tệp không bị hỏng từ phiên bản trước của nó). Vì các hàm băm rất khó có thể ánh xạ hai đầu vào vào cùng một đầu ra, nên bạn tính toán và lưu trữ một hàm băm của tệp đầu tiên, thường được biểu diễn dưới dạng một chuỗi. Hàm băm này rất nhỏ, có thể chỉ vài chục ký tự ASCII. Sau đó, khi bạn nhận được tệp thứ hai, bạn băm nó và kiểm tra xem đầu ra có giống nhau không. Nếu vậy, gần như chắc chắn đó là cùng một tệp byte-for-byte.

Một ứng dụng khác là về mật mã, trong đó các giá trị băm này khó "đảo ngược" - nghĩa là, với đầu ra và hàm băm, sẽ rất khó tính toán để tìm ra (các) đầu vào dẫn đến đầu ra đó. Một cách sử dụng này là cho mật khẩu: Thay vì lưu trữ mật khẩu, bạn lưu trữ mật mã băm của mật khẩu (có thể với một số thành phần khác). Sau đó, khi người dùng nhập mật khẩu, bạn tính toán hàm băm của nó và kiểm tra xem nó có khớp với hàm băm chính xác không; Nếu vậy, bạn nói mật khẩu là chính xác. (Bây giờ ngay cả những người có thể nhìn và tìm ra hàm băm được lưu trên máy chủ cũng không có thời gian dễ dàng giả vờ là người dùng.) Ứng dụng này có thể là trường hợp đầu ra dài hơn hoặc dài hơn đầu vào, vì đầu vào quá ngắn


1
Giải thích hay nhưng tôi không đồng ý với "rất khó xảy ra". Xem: programmers.stackexchange.com/questions/49550/... : va chạm làm xảy ra, và đôi khi đáng ngạc nhiên thường xuyên.
Olivier Dulac

8
Cũng lưu ý rằng trong ngữ cảnh của khoa học mạng, thuật ngữ "băm" rất ngụ ý một hoạt động "một chiều" không thể dễ dàng đảo ngược trong thực tế. Khi có thể dễ dàng đảo ngược, nó được gọi là "mã hóa". Đây là lý do tại sao những người trên Security.SE sẽ bảo bạn luôn băm mật khẩu của khách hàng, không bao giờ mã hóa chúng.
Ixrec

4
Một hàm băm không "dàn trải" vẫn là một hàm băm, có lẽ không phải là một hàm rất tốt cho ứng dụng của bạn.
Ngừng làm hại Monica

1
Chắc chắn, đây là tất cả những điểm tốt.
usul

10

Hàm băm là một hàm lấy đầu vào và tạo ra giá trị có kích thước cố định. Ví dụ: bạn có thể có hàm băm stringHashchấp nhận stringđộ dài bất kỳ và tạo ra số nguyên 32 bit.

Thông thường, chính xác để nói rằng đầu ra của hàm bămhàm băm (cũng được gọi là giá trị băm hoặc tổng băm). Tuy nhiên, đôi khi mọi người coi chính hàm này là hàm băm . Điều này là không chính xác về mặt kỹ thuật, nhưng thường bị bỏ qua vì nó thường được hiểu (trong ngữ cảnh) rằng người đó có nghĩa là hàm băm .

Cách sử dụng điển hình của hàm băm là để thực hiện bảng băm . Bảng băm là cấu trúc dữ liệu liên kết các giá trị với các giá trị khác thường được gọi là khóa. Nó thực hiện điều này bằng cách sử dụng hàm băm trên khóa để tạo ra giá trị băm có kích thước cố định mà nó có thể sử dụng để tra cứu nhanh dữ liệu mà nó lưu trữ. Tôi sẽ không đi vào chi tiết đầy đủ về cách thức thực hiện điều đó, nhưng thực tế quan trọng ở đây là nó được gọi là bảng băm vì nó dựa vào hàm băm để tạo ra giá trị băm (băm).

Đây là nơi mà một số sự nhầm lẫn xuất hiện, bởi vì một số người (một lần nữa, hơi không chính xác) coi bảng băm là một hàm băm. Như đã nêu trong các câu trả lời khác, đôi khi việc triển khai bảng băm của một ngôn ngữ nhất định đề cập đến bảng băm dưới dạng băm (đáng chú ý là Perl thực hiện điều này, mặc dù tôi hy vọng các ngôn ngữ khác cũng làm như vậy). Các ngôn ngữ khác chọn tham chiếu đến việc họ thực hiện bảng băm dưới dạng từ điển. Python là một trong những ngôn ngữ này, nhưng do chúng ăn sâu vào ngôn ngữ như thế nào, nhiều người dùng Python rút ngắn từ điển thành 'dict'.

Vì vậy, trong khi việc sử dụng đúng thuật ngữ băm là để chỉ giá trị băm được tạo bởi hàm băm , đôi khi người ta cũng sử dụng thuật ngữ không chính thức để chỉ các hàm bămbảng băm , do đó tạo ra sự nhầm lẫn.


2
Tôi không chắc chắn thực sự không chính xác khi đề cập đến bảng băm hoặc hàm băm là "hàm băm" (có vẻ như không tệ hơn, ví dụ, sử dụng "Washington" để có nghĩa là "Hoa Kỳ", như trong " Washington thận trọng hoan nghênh tuyên bố của Trung Quốc "). Nhưng tôi đồng ý rằng điều đó thật khó hiểu và thật tốt khi bạn hiểu rất rõ điều đó trong câu trả lời của mình.
David Richerby

1
@DavidR Richby Chính thức, tôi sẽ nói rằng công việc "băm" là không xác định. "Hàm băm", "giá trị băm", "bảng băm" và "để băm một chuỗi" đều có định nghĩa toán học chính xác nhưng "hàm băm" không rõ ràng. Tương tự, tôi biết ý của bạn là "Washington", nhưng câu của bạn vẫn có ý nghĩa nếu tôi hiểu "Washington" có nghĩa là "George Washington" hoặc "Denzel Washington" chứ không phải là "Thành phố Washington", đó là một cách không chính thức để chỉ chính phủ liên bang. Điểm mấu chốt: hãy cẩn thận đừng nhầm lẫn "hiểu ý của bạn" đối với một định nghĩa chính thức nghiêm ngặt.
Mike Ounsworth

@DavidR Richby Đó không thực sự là một sự tương tự. Sự không chính xác là tranh cãi nhưng không chính thức thì không.
Pharap

2

Hàm băm rộng rãi là bất kỳ chức năng nào có hình ảnh nhỏ hơn miền . Đầu ra của một chức năng như vậy f(x)có thể được gọi là "hàm băm của x".

Trong khoa học máy tính, chúng ta thường gặp hai ứng dụng của hàm băm.

Đầu tiên là dành cho các cấu trúc dữ liệu, chẳng hạn như bảng băm , trong đó chúng tôi muốn ánh xạ miền chính (ví dụ: số nguyên 32 bit hoặc chuỗi có độ dài tùy ý) thành một chỉ mục mảng (ví dụ: số nguyên từ 0 đến 100). Mục tiêu ở đây là tối đa hóa hiệu suất của cấu trúc dữ liệu; các thuộc tính của hàm băm thường được mong muốn là sự đơn giản và phân phối đầu ra thống nhất.

Perl gọi loại mảng kết hợp tích hợp của nó là "hàm băm" , dường như là nguyên nhân gây ra sự nhầm lẫn của bạn ở đây. Tôi không biết bất kỳ ngôn ngữ nào khác làm điều này. Cấu trúc dữ liệu có thể được xem như là một hàm băm (trong đó tên miền là tập hợp các khóa hiện tại), nhưng cũng được triển khai như một bảng băm.

Thứ hai là về mật mã : xác thực tin nhắn, xác minh mật khẩu / chữ ký, v.v ... Tên miền thường là các chuỗi byte tùy ý. Ở đây chúng tôi quan tâm đến bảo mật - đôi khi có nghĩa là hiệu suất thấp có chủ ý - trong đó các thuộc tính hữu ích là va chạm và kháng hình ảnh trước.


Và tôi vẫn phản đối câu đầu tiên của bạn vì khi băm mật khẩu 32 ký tự với SHA-512, không gian đầu vào thực sự nhỏ hơn không gian đầu ra. Khi kết hợp các hàm băm với nhau, miền và phạm vi là như nhau; kích thước của không gian đầu vào là không liên quan. Câu trả lời của Pharap có định nghĩa đúng: "Hàm băm là bất kỳ hàm nào có đầu ra có độ dài cố định". Đó là tất cả những gì bạn cần, tất cả các điều kiện khác mà bạn đang nói đến đều được ngụ ý từ đó.
Mike Ounsworth

@MikeOunsworth nhưng miền của SHA-512 là các chuỗi nhị phân có độ dài tùy ý. Tôi cho rằng tôi có thể ăn cắp từ ngữ Pharaps, nhưng tôi đã cố gắng làm cho các điều kiện rõ ràng vì lợi ích của OP. Tôi thực sự không chắc chắn "chiều dài cố định" là cần thiết, cũng không được xác định rõ ràng.
Ngừng làm hại Monica

@OrangeDog Ok, nhưng tôi có thể bọc SHA-512 bên trong một hàm được gọi là MikesHash()chấp nhận các chuỗi có độ dài 12 và chuyển chúng đến SHA-512 và trả về đầu ra. Tôi khá chắc chắn rằng MikesHash()vẫn đáp ứng định nghĩa của hàm băm. (Trong thực tế bạn đúng, các hàm băm mà chúng tôi sử dụng chấp nhận đầu vào có độ dài tùy ý, nhưng tôi không nghĩ có gì đó không phải là hàm băm nếu không.)
Mike Ounsworth

@MikeOunsworth như nhau Tôi có thể gói nó sao cho đầu ra bị cắt bớt hoặc được đệm nếu msb là một. Đầu ra không còn có độ dài cố định, nhưng nó vẫn là hàm băm?
Ngừng làm hại Monica

@OrangeDog Tôi sẽ nói không. Quan điểm của tôi là một hàm băm phải ánh xạ tới đầu ra có kích thước cố định, nhưng kích thước đầu vào không liên quan. Chúng tôi đã nhận được rất xa chủ đề. Câu trả lời của bạn có nội dung hay, chỉ cần cẩn thận với định nghĩa chính thức của bạn ;-)
Mike Ounsworth

0

Câu hỏi lớn Basil Ajith,

Dưới đây là quan điểm của tôi về những gì một hàm băm cho một cái gì đó tôi đang làm việc ngày hôm nay.

*

Sử dụng tổng kiểm tra để xác minh tarball có phù hợp với trang tải xuống không

*

nhập mô tả hình ảnh ở đây Puts trên mũ kiểm toán viên, ý tôi là áo choàng phù thủy

hàm băm là một giá trị / chuỗi / bất cứ thứ gì / nhãn đảm bảo nó giống với máy của bạn như là nguồn tải xuống.


3
Đây chỉ là một lần sử dụng cho một hàm băm. Có nhiều công dụng khác.
Yuval Filmus

Chào mừng đến với trang web! Việc sử dụng băm mật mã làm tổng kiểm tra đã được bao phủ bởi câu trả lời được chấp nhận, vì vậy câu trả lời của bạn không thêm bất cứ điều gì mới, trong khi chiếm nhiều không gian màn hình.
David Richerby

-1

Tôi sẽ cố gắng chỉ để thêm một bản tóm tắt ngắn gọn về những gì người khác nói.

Hàm băm

Có một loại hàm đặc biệt gọi là hàm băm.

"SHA256 là một hàm băm nổi tiếng được bảo mật bằng mật mã"

Ba ứng dụng chính là * bảng băm, * tổng (kiểm tra tính toàn vẹn dữ liệu, ví dụ như trong ổ cứng hoặc giao thức ADSL), * và mật mã (các hình thức xác thực mật mã khác nhau bao gồm nhưng không giới hạn ở chữ ký số và lưu trữ mật khẩu an toàn).

Bảng băm

Bảng băm là một cấu trúc dữ liệu để tìm kiếm nhanh. Nó sử dụng hàm băm trong nội bộ, do đó tên.

"Cơ sở dữ liệu sử dụng bảng băm và tìm kiếm cây bên trong để tăng tốc độ thực hiện các yêu cầu tìm kiếm"

Băm

  1. một kiểu dữ liệu trừu tượng từ điển

"Hash" là tên chính thức của từ điển tích hợp trong Perl. Chúng là bảng băm trong nội bộ, do đó tên. "Chương trình con này chấp nhận một hàm băm làm đối số đầu tiên của nó". Những ngày này có thể được sử dụng cho bất kỳ mảng kết hợp, không nhất thiết phải là bảng băm.

  1. kết quả của việc áp dụng hàm băm cho một số đầu vào

"Băm MD5 của hình ảnh .iso được cung cấp để kiểm tra tính toàn vẹn của chúng sau khi tải xuống".

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.