Hỏi về cách phân loại cấu trúc dữ liệu trong Python

Em có lên mạng tra thì thấy có trang chia làm 2 loại là hash object/ unhash object và trang chia làm mutable/imutable nhưng không có trang nào đề cập đến cả hai nên em đoán là 2 cách gọi khác nhau và unhash = mutable nhưng em vẫn thấy hơi phân vân về cách giải thích của 2 trang nó hơi khác nhau. Mọi người cho em ý kiến với ạ.

Hash và mutable/immutable là hai khái niệm khác nhau. Tuy vậy, chúng có liên hệ với nhau, tôi sẽ giải thích rõ hơn như sau:

  • Hash là quá trình chuyển đổi một lượng dữ liệu lớn thành một lượng dữ liệu nhỏ hơn(thường là dưới dạng một số nguyên) sao cho nó có thể được truy cập trong thời gian cố định (O(1) - nếu bạn có học qua về ký pháp Big O trong các khóa học về thuật toán). Quá trình này không thể đảo ngược, vì vậy, không có khái niệm unhash (Ví dụ như nếu bạn lưu trữ password trong Cơ sở dữ liệu dưới dạng hash, ngay cả khi có ai đó truy cập trái phép vào cơ sở dữ liệu của bạn, người đó cũng không thể đảo ngược các giá trị hash này thành các password ban đầu được).
  • Immutable là một tính chất của các đối tượng mà chúng ta không thể thay đổi giá trị sau khi chúng đã được khởi tạo. Ví dụ như trong Python hoặc trong C#, string là immutable vì khi bạn đã tạo ra một đối tượng string và gán cho nó một giá trị nào đó, bạn không thể thay đổi giá trị của đối tượng này. Và ngược lại, nếu bạn có thể thay đổi giá trị của một đối tượng sau khi đã khởi tạo nó thì đó là một đối tượng có thuộc tính mutable.

Theo như định nghĩa trên thì hashimmutable/mutable hoàn toàn khác nhau. Tuy vậy, các đối tượng immutable thường được xem là hashable vì giá trị của nó không thay đổi. Còn các đối tượng mutable thì không được dùng với hash (không có nghĩa là unhash nhé! Nếu dùng tiếng Anh thì là unhashable) vì giá trị của nó thay đổi, và kéo theo giá trị của hash tương ứng cũng sẽ thay đổi. Do đó làm mất đi ý nghĩa của hash là đảm bảo thời gian truy cập theo O(1).

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?