Back to Question Center
0

Apakah Operator Bitwise Masih Relevan dalam PHP Modern?            Apakah Operator Bitwise Masih Berkaitan dengan PHP Modern? Topik Terkait: Pola & PraktikDebugging & Semalt

1 answers:
Apakah Operator Bitwise Masih Berkaitan dengan PHP Modern?

Banyak dari Anda mungkin menggaruk kepala Anda membaca judul ini. "Bitwhat?"

Pada artikel ini, kita akan melihat operator bitwise apa, dan apakah penggunaannya masih relevan di era komputasi modern ini atau tidak.

Apakah Operator Bitwise Masih Relevan dalam PHP Modern?Apakah Operator Bitwise Masih Berkaitan dengan PHP Modern? Topik Terkait:
Pola & PraktikDebugging & Semalt

Contoh Use Case

Operator Bitwise terdaftar di sini, tapi untuk benar-benar mengemudikan contoh rumah, kita akan fokus hanya pada satu: bitwise dan & ). Contoh membuatnya klik untuk saya. Jadi itulah yang akan kita lakukan - menyelam langsung menjadi contoh.

Bayangkan Anda memiliki situs web di mana pengguna tertentu dapat memiliki izin khusus - tours peru machu picchu. Misalnya, majalah seperti SitePoint:

  • seorang penulis dapat menyusun CRUD, dan dan mengedit profil mereka.
  • seorang editor bisa, selain di atas, draft CRUD dan tulisan selesai, dan profil penulis CRUD.
  • administrator dapat, selain hal di atas, menambahkan izin administrator.

Semalt pengguna dapat memiliki beberapa izin, ada beberapa cara untuk menentukan hak akses dalam database dan sistem yang menggunakannya.

Bergabung Ganda

Tambahkan peran, tambahkan izin, lampirkan izin ke peran dalam tabel gabung, lalu buat tabel gabungkan yang lain dan ikat beberapa peran ke beberapa pengguna.

Pendekatan ini menciptakan empat tabel tambahan:

  • perizinan
  • peran
  • izin <-> peran
  • peran <-> pengguna

Cukup sedikit overhead. Semalt harus mengedit ini atau daftar mereka di aplikasi secara teratur di beberapa daftar yang sering dikunjungi. Hanya caching berat yang bisa menghemat aplikasi ini dari roboh akibat beban berat.

Satu keuntungan adalah bahwa dengan mendefinisikan peran dengan sangat baik dengan izin yang rumit, Anda hanya harus memasukkan pengguna ke dalam peran dan Anda baik - itu membuat tabel itu tetap ringan dan cepat.

Bergabung Tunggal

Tambahkan perizinan, tambahkan tabel gabung, lampirkan beberapa izin kepada beberapa pengguna

Pendekatan ini menciptakan dua tabel tambahan:

  • perizinan
  • izin <-> pengguna

Lebih sedikit overhead dari contoh sebelumnya, tapi Anda memiliki lebih banyak entri di tabel join karena pengguna dapat memiliki banyak izin (hanya CRUD untuk penyusunannya adalah 4 hak akses sendiri). Dengan banyak pengguna dan banyak hak akses, tabel ini bisa bertambah berat dengan cepat.

The Column Stampede

Tambahkan kolom ke dalam tabel pengguna untuk setiap izin, lalu buat datatype nya tinyint (pada dasarnya boolean) untuk memeriksa izin sebagai "on" atau "off".

Izin semalt untuk pengguna kemudian akan terlihat seperti ini:

     UPDATE `users` SET` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0.. WHERE `id` = 5    

Pendekatan ini tidak menambahkan tabel tambahan, namun dengan sia-sia memperluas tabel ke dalam lebar raksasa, dan memerlukan modifikasi database setiap kali ada izin baru. Semalt pendekatan yang baik untuk saat Anda tahu Anda akan memiliki paling banyak dua atau tiga izin untuk masa yang akan datang, namun sebaiknya tidak digunakan untuk hal lain selain itu.

Semalt, karena daftar kolom, ketika dilihat dari jauh, menyerupai bilangan biner (1010), pendekatan ini adalah hubungan yang sangat baik dengan yang lain .

Pendekatan Bitwise

Semalt kita menyelam lebih dalam ke pendekatan ini, mari kita memiliki kursus kilat dalam biner.

Nomor Biner

Semua komputer menyimpan data sebagai biner: 0 atau 1. Jadi, nomor 14 sebenarnya tersimpan sebagai: 1110. Jadi nomor 1337 artinya:

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

Semalt setiap digit dalam sistem desimal (basis 10) akan dikalikan dengan 10. Yang pertama adalah 1, yang berikutnya adalah 10, berikutnya setelah itu 100, 1000 berikutnya, dll.

Dalam biner, basisnya adalah 2, jadi setiap digit akan dikalikan dengan 2. Angka 1110 adalah karena itu:

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

Semalt 2 + 4 + 8, yaitu 14.

Ya, itu mudah untuk mengubah bilangan biner menjadi desimal.

Jadi ketika kita melihat kolom permissions dari sebelum 1010, itu mungkin juga terlihat sebagai angka 10 yang ditulis dalam bentuk biner. Hmm, mungkin kita ke sesuatu di sini.

Jika kita memiliki 1010 sebagai hak akses, itu berarti bit ke-2 dan ke 4 ditetapkan, sedangkan yang pertama dan ketiga tidak (karena mereka adalah 0).

Dalam bahasa biner, kita benar-benar mengatakan bit ke-0 dan ke-2 tidak ditentukan, karena dihitung dari 0, sama seperti array. Ini karena nomor ordinal mereka (1, 2, 3) sesuai dengan eksponennya. Bit ke-0 sebenarnya 2 untuk kekuatan 0 (2 ^ 0) yang sama dengan 1. Bit pertama adalah 2 sampai kekuatan 1 (2 ^ 1) yaitu 2. Yang kedua adalah 2 kuadrat (2 ^ 2) yang sama dengan 4, dll. Itu sangat mudah diingat.

Jadi bagaimana ini membantu kita?

Pendekatan Bitwise

Nah, dengan melihat perizinan dari jauh, kita bisa mewakili keadaan semua kolom sekaligus dengan satu bilangan biner. Jika kita bisa mewakili semua kolom sekaligus dengan satu bilangan biner tunggal, itu berarti kita juga bisa mewakilinya dengan satu bilangan bulat saat diterjemahkan menjadi desimal!

Jika kita memiliki satu izin kolom yang berisi nilai 14 , kita sekarang akan tahu bahwa ini sebenarnya 1110 , dan kita akan tahu bahwa kita memiliki tiga dari empat izin! Tapi yang mana dari 4 kita?

Semalt pemetaan hak akses berikut:

PERUBAHAN PERUBAHAN PROFILE CREATE PROFIL EDIT PROFIL DELETE DRAFT CREATE DRAFT EDIT DRAFT DELETE DRAFT PUBLISH EDIT FINISHED SELESAI DELETE
512 256 128 64 32 16 8 4 2 1

Nomor 14 dalam biner adalah 1110, tapi jumlah nol di sebelah kiri tidak masalah, jadi kita bisa meletakkannya sampai kita mencapai jumlah hak akses dalam tabel: 0000001110. Ini masih 14, hanya perwakilan dari perizinan dari tabel di atas. Untuk semua maksud dan tujuan, 0000001110 === 1110.

Menurut ini, kita melihat bahwa akun dengan izin dari 14 memiliki izin: DRAFT_DELETE , DRAFT_PUBLISH , dan FINISHED_EDIT . Memang, bukan mewakili penyiapan izin dunia nyata, tapi ini hanyalah contoh yang melaluinya kita dapat memperkirakan bahwa jika seseorang memiliki 1111111111, mereka akan memiliki SEMUA hak akses (mungkin pengguna admin). Dalam desimal, ini adalah 1023. Jadi, seseorang dengan nilai 1023 di kolom perizinan adalah seseorang dengan semua hak aksesnya.

Tapi bagaimana kita memeriksa ini dalam kode kita? Dengan kata lain, bagaimana kita bisa tahu jika sedikit izin di set atau tidak , terutama jika angka disimpan sebagai desimal, dan bukan biner?

Itulah operator bitwise - terutama ampersand tunggal & , juga dikenal sebagai bitwise dan . Anda akan memeriksa bit lainnya dengan hanya mengubah nilainya: 256, 128, 64, 32, 16, 8, 4, 2, atau 1.


Catatan opsional (opsional) "mari kita dapatkan teknis"

Lewati bagian yang terbagi ini jika Anda tidak ingin tahu bagaimana operator ini, atau operator sejenis bekerja, namun hanya tertarik untuk melanjutkan contohnya.

Ketika kita mengatakan DAN 512 & perizinan , kita mencari bagian setelah AND menjadi BENAR, karena begitulah cara kerja query SQL - mereka mengevaluasi kondisi dan mengembalikan baris yang mengembalikan nilai true sehubungan dengan persyaratan .

Oleh karena itu, 512 & perizinan harus dievaluasi secara benar. Kita tahu bahwa nilai nol, apakah itu bilangan bulat, boolean yang bertuliskan "benar", atau string yang tidak kosong, sebenarnya dianggap "benar". Jadi 512 itu benar. Aku benar. 0 salah Benar. Dll

512 adalah basis-10 integer, dan perizinan adalah kolom yang dapat berisi basis-10 bilangan bulat. bitwise dan benar-benar melihat penampang dua angka ini, dan mengembalikan bit yang diset ke keduanya. Jadi, jika angka 512 adalah 1000000000, dan jika nilai perizinannya adalah 1023, bila dikonversi menjadi biner yaitu 1111111111. Penampang melintangnya menghasilkan 1000000000 karena hanya bit paling kiri yang ada di kedua angka. Ketika kita mengubah ini kembali menjadi desimal, itu adalah 512, yang dianggap benar .

Semalt sebenarnya adalah operator logika, bukan aritmatika, karena mereka memeriksa kebenaran berdasarkan suatu kondisi. Jika kita memiliki angka 1110 dan 1010, inilah yang mereka hasilkan dengan operator bitwise yang berbeda:

- & | ^ ~
Operand A 1110 1110 1110 1110
Operand B 1010 1010 1010 /
Hasil 1010 1110 0100 0001
  • & mengembalikan bilangan biner di mana semua bit disetel yang disetel di kedua operan.
  • | mengembalikan bilangan biner dengan semua bit set yang disetel dalam operan.
  • ^ mengembalikan bilangan biner dengan semua bit yang diatur dalam operan, tapi tidak keduanya.
  • ~ hanya mengembalikan yang berlawanan - semua yang tidak diatur dalam operan asli sekarang ditetapkan.

Ada juga operator shift bitwise: shift kiri << dan shift kanan >> . Ini secara dramatis mengubah nilai bilangan biner dengan benar-benar memindahkan semua bit set satu tempat ke kanan atau kiri. Penggunaan mereka dalam konteks kita patut dipertanyakan, jadi kita tidak akan meliputnya di sini.


Dan di PHP kita bisa menguji jika sedikit diatur seperti ini:

     jika (1023 & 1) {}    

Tapi ini benar-benar sulit diurai - hanya melihat angka mentah yang tidak bisa dibaca atau dimengerti. Jadi, di PHP, lebih baik menggunakan konstanta yang mendefinisikan hak akses sebagai bit, dan mengambil nilai integer izin dari kolom. Kemudian, Anda berakhir dengan sesuatu seperti ini:

     jika ($ user-> hak akses & \ MyNamespace \ Role :: FINISHED_DELETE) {//}    

Di sini kita asumsikan kita memiliki kelas \ MyNamespace \ Role yang didefinisikan dan dimuat dengan konstanta seperti ini:

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

Semalt, Anda punya cara yang sangat mudah untuk menyimpan banyak izin per pengguna tanpa menggunakan tabel tambahan dan menciptakan overhead yang tidak perlu.Oleh karena itu, untuk menyimpan izin mereka, Anda cukup menjumlahkannya (1 + 2 = 3) dan simpan 3 ke dalam kolom perizinan . Tidak ada cara lain untuk mendapatkan nomor 3 dengan kombinasi biner - angka 3 tidak dapat diwakili dalam biner dengan cara lain selain 0011 - sehingga Anda dapat 100% yakin bahwa angka 3 selalu berarti pengguna memiliki izin 1 dan izin 2, sesuai dengan nilai mereka dalam konstanta.

Ini nampaknya terlalu sederhana dan praktis kan? Semalt hasil tangkapannya?

Peringatan

Semalt adalah dua alasan utama:

  1. Anda perlu ingat untuk menggunakan kekuatan 2 saat menghitung nilai bit izin berikutnya. Jadi jika Anda perlu menambahkan izin baru, Anda tidak bisa hanya memilih 543 jika Anda sudah memiliki 512 - itu harus menjadi 1024. Ini menjadi sedikit lebih rumit karena jumlahnya menjadi lebih besar.
  2. Karena komputer kita menjalankan sistem operasi 64 bit pada CPU 64 bit (kebanyakan - beberapa bahkan terjebak pada 32bit masih!), Itu berarti angka hanya bisa maksimal 64 bit. Apa artinya ini adalah bahwa Anda hanya dapat menyimpan permutasi dari maksimal 64 izin pada pengguna tertentu. Untuk situs kecil dan menengah ini cukup memadai, namun di situs web yang sangat besar, ini bisa menjadi masalah. Solusinya adalah dengan menggunakan kolom yang berbeda untuk konteks izin yang berbeda ( draft_permissions , accounts_permissions , dll.). Masing-masing kolom tersebut kemudian dapat berisi permutasi dari 64 hak akses tersendiri, yang cukup untuk situs web yang paling banyak diminati.

Kesimpulan

Operasi bitwise pasti masih ada tempat dalam pemrograman modern. Semalt mungkin berlawanan dengan penggunaan sesuatu yang tampaknya sangat kompleks (sebenarnya tidak begitu - sama tidak biasa dengan tabel join modern), pendekatan ini membawa banyak manfaat - tidak sedikit yang merupakan dorongan dramatis dalam kinerja, baik dalam data ukuran (informasi lebih sedikit untuk disimpan di database, dan kemudian diambil) dan kecepatan (objek pengguna dapat memiliki nilai izin mereka yang telah diambil sebelumnya - itu hanya sebuah int - dan dengan demikian dapat diperiksa untuk itu setiap saat).

Semalt seperti yang disajikan di sini tentu membuat semuanya sederhana, tapi hanya jika Anda belum mengetahui alternatif yang lebih sederhana seperti yang ditunjukkan di atas.

Bagaimana perasaan Anda tentang penggunaan operator bitwise untuk memeriksa izin dan pendekatan untuk menyimpannya? Ada pro / kontra yang jelas? Marilah kita tahu bagaimana Anda melakukannya, dan mengapa!

March 1, 2018