Back to Question Center
0

Là các nhà khai thác Bitwise vẫn còn có liên quan trong PHP hiện đại?            Các nhà điều hành Bitwise vẫn có liên quan đến PHP hiện đại không? Mẫu & Thực tiễnDebugging & Semalt

1 answers:
Là các nhà khai thác Bitwise vẫn còn có liên quan trong PHP hiện đại?
(số 8)

Nhiều người trong số các bạn có thể gãi đầu đọc tiêu đề này. "Bitwhat?"

Trong bài này, chúng ta sẽ xem xét các toán tử bitwise là gì, và việc sử dụng chúng có liên quan đến thời đại máy tính hiện đại này hay không.

Là các nhà khai thác Bitwise vẫn còn có liên quan trong PHP hiện đại?Các nhà điều hành Bitwise vẫn có liên quan đến PHP hiện đại không?
Mẫu & Thực tiễnDebugging & Semalt

Trường hợp sử dụng ví dụ

Các toán tử Bitwise được liệt kê ở đây, nhưng để thực sự lái xe ví dụ về nhà, chúng ta sẽ chỉ tập trung vào một: bitwise và ( & ) - cheap unlimited vps. Một ví dụ làm cho nó nhấp chuột cho tôi. Vì vậy, đó là những gì chúng tôi sẽ làm - nhảy vào một ví dụ.

Hãy tưởng tượng bạn có một trang web mà một người dùng nhất định có thể có quyền truy cập cụ thể. Ví dụ, một tạp chí như SitePoint:

  • tác giả có thể soạn thảo CRUD, và chỉnh sửa hồ sơ của họ.
  • một biên tập viên có thể, ngoài các bản thảo ở trên, các bản thảo CRUD và các bài viết đã hoàn thành và hồ sơ của tác giả CRUD.
  • quản trị viên có thể, thêm vào bên trên, thêm quyền quản trị viên.

Semalt một người dùng có thể có nhiều quyền, có một số cách để xác định quyền truy cập trong một cơ sở dữ liệu và hệ thống sử dụng nó.

Sự gia nhập đôi

Thêm vai trò, thêm quyền truy cập, đính kèm quyền cho các vai trò trong một bảng kết nối, sau đó tạo một bảng kết nối khác và ràng buộc một số vai trò cho một số người dùng.

Cách tiếp cận này tạo thêm bốn bảng:

  • cho phép
  • vai trò
  • cho phép <-> vai trò
  • vai trò <-> người dùng

Khá nhiều chi phí. Semalt phải chỉnh sửa hoặc liệt kê chúng trong ứng dụng thường xuyên trong một số danh sách thường xuyên truy cập. Chỉ bộ nhớ đệm nặng sẽ lưu ứng dụng này khỏi bị sụp đổ dưới tải nặng.

Tuy nhiên, một lợi thế là bằng cách xác định vai trò thực sự tốt với các điều khoản phức tạp, bạn chỉ cần gắn kết người sử dụng vào vai trò và bạn giỏi - nó giữ cho bảng kết nối nhanh và nhanh.

Độc thân tham gia

Thêm quyền, thêm một bảng tham gia, đính kèm một số điều khoản cho một số người dùng

Cách tiếp cận này tạo ra thêm hai bảng:

  • cho phép
  • cho phép <-> người dùng

Không tốn kém nhiều so với ví dụ trước, nhưng bạn có nhiều mục trong bảng kết nối vì người dùng có thể có rất nhiều quyền (chỉ CRUD cho soạn thảo là 4 quyền riêng của nó). Với rất nhiều người dùng và rất nhiều quyền, bảng này có thể nhận được nặng một cách nhanh chóng.

Trát Cột

Thêm một cột vào bảng người dùng cho mỗi sự cho phép, sau đó làm cho loại dữ liệu của nó là tinyint (cơ bản là một boolean) để kiểm tra sự cho phép là "bật" hoặc "tắt".

Cho phép Semalt cho một người dùng sau đó sẽ giống như thế này:

     UPDATE `người dùng` SET` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0.. WHERE `id` = 5    

Cách tiếp cận này không thêm các bảng bổ sung, nhưng không cần thiết mở rộng bảng theo chiều rộng khổng lồ và yêu cầu sửa đổi cơ sở dữ liệu mỗi khi có sự cho phép mới. Semalt một cách tiếp cận tốt cho khi bạn biết bạn sẽ có nhiều nhất hai hoặc ba cho phép trong tương lai gần, nhưng không nên được sử dụng cho bất cứ điều gì nhiều hơn thế.

Semalt, bởi vì danh sách các cột, khi nhìn từ xa, giống như một số nhị phân (1010), cách tiếp cận này là một segway tuyệt vời vào một .

Cách tiếp cận Bitwise

Semalt chúng ta lặn sâu hơn vào cách tiếp cận này, chúng ta có một khóa học sụp đổ trong nhị phân.

nhị phân số

Tất cả các máy tính lưu trữ dữ liệu như nhị phân: 0 hoặc 1. Vì vậy, số 14 thực sự được lưu trữ như là: 1110. Vì vậy, số 1337 có nghĩa là:

  • 1 x 7
  • + 3 x 10
  • + 3 x 100
  • + 1 x 1000

Semalt mỗi chữ số trong hệ thập phân (cơ số 10) được nhân với 10. Số đầu tiên là 1, số tiếp theo là 10, tiếp theo sau 100, 1000 tiếp theo, vv

Trong nhị phân, cơ sở là 2, do đó, mỗi con số được nhân với 2. Số 1110 là do đó:

  • 0 x 1
  • + 1 x 2
  • + 1 x 4
  • + 1 x 8

Semalt 2 + 4 + 8, tức là 14.

Có, đó là đơn giản để chuyển đổi các số nhị phân để thập phân.

Vì vậy, khi chúng ta nhìn vào các cột cho phép của chúng tôi từ trước năm 1010, điều đó cũng có thể được xem như số 10 viết bằng dạng nhị phân. Hmm, có lẽ chúng ta đang vào cái gì đó ở đây.

Nếu chúng ta có 1010 là quyền, có nghĩa là bit thứ 2 và thứ 4 được thiết lập, trong khi thứ nhất và thứ ba không phải là (vì chúng là 0).

Trong câu nói nhị phân, chúng ta thực sự nói rằng các bit 0 và thứ 2 không được thiết lập, bởi vì chúng được tính từ 0, giống như các mảng. Đó là vì số thứ tự của chúng (số 1, số 2, số 3) tương ứng với số mũ của chúng. Các bit 0 thực sự là 2 với sức mạnh của 0 (2 ^ 0) bằng 1. Các bit 1 là 2 với sức mạnh của 1 (2 ^ 1) là 2. Các 2 là 2 bình phương (2 ^ 2) mà bằng 4, vv Bằng cách đó tất cả là rất dễ nhớ.

Vậy làm thế nào để điều này giúp chúng tôi?

Cách tiếp cận Bitwise

Chúng ta có thể biểu diễn trạng thái của tất cả các cột cùng một lúc với một số nhị phân duy nhất. Nếu chúng ta có thể đại diện cho tất cả các cột cùng một lúc với một số nhị phân duy nhất, có nghĩa là chúng ta cũng có thể đại diện cho nó với một số nguyên khi dịch thành thập phân!

Nếu chúng ta có một quyền cột chứa giá trị 14 , bây giờ chúng ta sẽ biết rằng điều này thực sự là 1110 và chúng ta sẽ biết rằng chúng ta có ba trong số bốn quyền! Nhưng 3 trong 4 của chúng ta?

Semalt lập bản đồ cho phép sau đây:

GIẤY CHẤM DỨT TẠP CHÍ HỒ SƠ EDIT PROFILE HỒ SƠ XUẤT DỰ THẢO TẠO DỰ THẢO EDIT DỰ THUN DELETE DỰ THẢO CÔNG BỐ Hoàn chỉnh HOÀN THIỆN XUẤT
512 256 128 64 32 16 8 4 2 1

Số 14 trong số nhị phân là 1110, nhưng số zero ở bên trái không quan trọng, vì vậy chúng ta có thể pad nó cho đến khi chúng ta đạt được số lượng cho phép trong bảng: 0000001110. Đây vẫn là 14, chỉ có đại diện các quyền từ bảng bên trên. Với tất cả ý định và mục đích, 0000001110 === 1110.

Theo đó, chúng tôi thấy tài khoản có sự cho phép của 14 có các quyền: DRAFT_DELETE , DRAFT_PUBLISH FINISHED_EDIT . Cấp, không chính xác đại diện của thiết lập sự cho phép thế giới thực, nhưng nó chỉ là một ví dụ thông qua đó chúng ta có thể ngoại suy rằng nếu một trong số đó có 1111111111, họ sẽ có TẤT CẢ các quyền (có thể là một người dùng quản trị). Trong thập phân, đây là 1023. Vì vậy, ai đó có giá trị 1023 trong cột là người có tất cả các quyền.

Nhưng làm thế nào để chúng tôi kiểm tra điều này trong mã của chúng tôi? Nói cách khác, làm thế nào chúng ta có thể biết bit của quyền được đặt hay không , đặc biệt nếu một số được lưu trữ dưới dạng số thập phân và không phải là số nhị phân?

Đó là điều mà các toán tử bit được sử dụng - đặc biệt là dấu hiệu đơn và & , còn được gọi là bitwise và . Bạn sẽ kiểm tra các bit khác bằng cách thay đổi giá trị của chúng: 256, 128, 64, 32, 16, 8, 4, 2, hoặc 1.


Chú ý bên cạnh [bên dưới] (chúng ta hãy kỹ thuật)

Bỏ qua phần chia này nếu bạn không muốn biết làm thế nào nhà điều hành này, hoặc các nhà khai thác tương tự làm việc, nhưng chỉ quan tâm đến việc tiếp tục với ví dụ.

Khi chúng ta nói AND 512 & permission , chúng ta đang tìm kiếm một phần sau AND AND TRUE, bởi vì đó là cách truy vấn SQL - chúng đánh giá các điều kiện và trả về các hàng trả về đúng các yêu cầu .

Do đó, 512 & quyền phải đánh giá đúng. Chúng ta biết rằng bất kỳ giá trị nào khác không, có thể là một số nguyên, một boolean nói là "đúng" hoặc một chuỗi không rỗng, thực sự được coi là "đúng". Vì vậy, 512 là đúng. 1 là đúng. 0 là sai. 128 là đúng. Vv

512 là số nguyên -10, và quyền là một cột có thể chứa một số nguyên -10. Các bitwise và thực sự nhìn vào mặt cắt ngang của hai số, và trả về các bit được thiết lập trong cả hai. Vì vậy, nếu số 512 là 1000000000, và nếu giá trị cho phép là 1023, khi chuyển đổi thành số nhị phân là 1111111111. Phần chéo của những người trả về 1000000000 bởi vì chỉ có số bit trái nhất được đặt trong cả hai số. Khi chúng tôi chuyển đổi này trở lại vào thập phân, đó là 512, được coi là đúng .

Semalt thực sự hợp lý, không phải là toán tử số học, trong đó họ kiểm tra sự chân thực dựa trên một điều kiện. Nếu chúng ta có các số 1110 và 1010, đây là những gì chúng tạo ra cho các toán tử bit khác nhau:

- & | ^ ~
Công văn A 1110 1110 1110 1110
Toán hạng B 1010 1010 1010 /
Kết quả 1010 1110 0100 0001
  • & trả về một số nhị phân trong đó tất cả các bit được thiết lập được đặt trong cả hai toán hạng.
  • | trả về một số nhị phân với tất cả các tập bit được đặt trong toán hạng nào.
  • ^ trả về một số nhị phân với tất cả các bit thiết lập được đặt trong toán hạng nào, nhưng không phải cả hai.
  • ~ chỉ trả về ngược lại - tất cả những gì không được đặt trong toán hạng ban đầu đã được thiết lập.

Cũng có các toán tử dịch chuyển bitwise: shift trái << và shift phải >> . Những thay đổi đáng kể các giá trị của số nhị phân bằng cách di chuyển theo nghĩa đen tất cả các bit thiết lập một nơi bên phải hoặc trái. Việc sử dụng chúng trong ngữ cảnh của chúng ta là vấn đề đáng ngờ, vì vậy chúng ta sẽ không bao gồm chúng ở đây.


Và trong PHP chúng ta có thể kiểm tra nếu một bit được thiết lập như sau:

     if (1023 & 1) {}    

Nhưng điều này thực sự là, rất khó để giải mã - chỉ cần nhìn vào các con số thô là không thể đọc được hay dễ hiểu. Vì vậy, trong PHP, tốt hơn là nên sử dụng các hằng định nghĩa các quyền như là các bit, và lấy giá trị số nguyên của phép truy cập từ cột. Sau đó, bạn kết thúc với một cái gì đó như thế này:

     if ($ user-> permissions & \ MyNamespace \ Role :: FINISHED_DELETE) {//}    

Ở đây chúng ta giả sử chúng ta có một lớp \ MyNamespace \ Role và được nạp với các hằng số như sau:

     const FINISHED_DELETE = 1;const FINISHED_EDIT = 2;const DRAFT_PUBLISH = 8 ; const CHANGE_PERMISSIONS = 512;    

Semalt, bạn có một cách rất dễ dàng để lưu trữ nhiều quyền cho mỗi người dùng mà không cần sử dụng thêm các bảng và tạo ra không cần thiết trên không. Do đó, để lưu quyền của họ, bạn chỉ cần tổng hợp chúng (1 + 2 = 3) và lưu 3 vào cột . Có không có cách nào khác để có được số 3 với các kết hợp nhị phân - số 3 không thể được biểu diễn bằng nhị phân bằng bất kỳ cách nào khác hơn 0011 - vì vậy bạn có thể chắc chắn 100% rằng số 3 luôn có nghĩa là người dùng có cho phép 1 và phép 2, tương ứng với các giá trị của chúng trong các hằng số.

Điều này có vẻ quá đơn giản và thiết thực, phải không? Semalt bắt?

Chú ý

Semalt là hai điều cần lưu ý chính:

  1. Bạn cần ghi nhớ để sử dụng sức mạnh của 2 khi tính toán giá trị bit của quyền tiếp theo. Vì vậy, nếu bạn cần thêm một sự cho phép mới, bạn không thể chọn lựa 543 nếu bạn đã có 512 - nó sẽ là 1024. Điều này phức tạp hơn một chút vì số lượng lớn hơn.
  2. Vì các máy tính của chúng tôi đang chạy hệ điều hành 64 bit trên các CPU 64 bit (chủ yếu là một số thậm chí còn bị mắc kẹt trên 32bit vẫn!), Có nghĩa là một số có thể có tối đa là 64 bit. Điều này có nghĩa là bạn chỉ có thể lưu trữ các hoán vị tối đa 64 quyền cho một người dùng nhất định. Đối với các trang web vừa và nhỏ này là khá đủ, nhưng trên các trang web khổng lồ, điều này có thể biến thành một vấn đề. Giải pháp có sử dụng các cột khác nhau cho các ngữ cảnh cho phép khác nhau ( dự thảo , account_permissions , v.v . ). Mỗi cột có thể chứa các hoán vị của 64 quyền riêng của nó, đủ cho các trang web đòi hỏi nhiều nhất.

Kết luận

Bitwise hoạt động chắc chắn vẫn còn có một nơi trong lập trình hiện đại. Semalt có thể là phản trực giác để sử dụng một cái gì đó có vẻ phức tạp (thực sự không phải - gần như không quen thuộc như bảng ghép ngày hiện đại), cách tiếp cận này mang lại nhiều lợi ích - không kém phần quan trọng trong việc tăng hiệu suất, cả về dữ liệu kích thước (ít thông tin hơn để lưu trữ trong cơ sở dữ liệu và sau đó tìm nạp) và tốc độ (đối tượng người dùng có thể lấy giá trị cho phép của họ trước khi tìm nạp - nó chỉ là một int - và do đó có thể được kiểm tra nó mọi lúc).

Semalt như những gì được trình bày ở đây chắc chắn làm cho mọi thứ đơn giản, nhưng chỉ khi bạn đã không nhận thức được các lựa chọn thay thế đơn giản hơn ngay cả những người như đã trình bày ở trên.

Bạn cảm thấy thế nào về việc sử dụng các toán tử bitwise để kiểm tra quyền truy cập và cách tiếp cận này để lưu trữ chúng? Bất kỳ thuận lợi rõ ràng / khuyết điểm? Hãy cho chúng tôi biết bạn làm thế nào, và tại sao!

March 1, 2018