Back to Question Center
0

Jsou bitové operátory stále relevantní v moderním PHP?            Jsou bitové operátory stále relevantní v moderním PHP? Související témata: Vzory & PraxeDebugging & Semalt

1 answers:
Jsou bitové operátory stále relevantní v moderním PHP?

Mnoho z vás pravděpodobně poškrábalo vaše hlavy číst tento titul. "Kdysi?"

V tomto článku se podíváme na to, jaké jsou bitové operátory, a zda je jejich použití v tomto moderním věku výpočtu stále relevantní.

Jsou bitové operátory stále relevantní v moderním PHP?Jsou bitové operátory stále relevantní v moderním PHP? Související témata:
Vzory a praktikyDebugging & Semalt

Příklad Použití pouzdra

Zde jsou uvedeny bitové operátory, ale abychom skutečně řídili příklad domů, zaměříme se pouze na jednu bitovou a ( a ). Příklad mi dal kliknout. Takže to uděláme - se ponoříme přímo do příkladu.

Představte si, že máte webovou stránku, na které daný uživatel může mít konkrétní oprávnění - downtown san jose computer repair. Například časopis jako SitePoint:

  • , autor může zpracovávat návrhy a upravovat jejich profil.
  • editor může, navíc k výše uvedeným, CRUD návrhy a dokončené příspěvky, a profily autorů CRUD.
  • může administrátor kromě výše uvedeného přidat oprávnění administrátora.

Semalt uživatel může mít více oprávnění, existuje několik způsobů, jak definovat oprávnění v databázi a systém používat.

Double Join

Přidávejte roli, přidáváte oprávnění, přiřaďte oprávnění k rolím v tabulce spojů a poté vytvořte jinou tabulku spojů a sdělujte některé role některým uživatelům.

Tento přístup vytváří čtyři další tabulky:

  • oprávnění
  • rolí
  • oprávnění <-> role
  • role <-> uživatelé

Docela trochu režie. Semaltem je třeba je upravit nebo je seznamovat v aplikaci pravidelně v některých často navštěvovaných seznamech. Pouze těžké ukládání do mezipaměti by tuto aplikaci ušetřilo z toho, že by se zhroutila pod těžkou zátěží.

Jednou výhodou je však to, že definováním rolí opravdu dobře s komplikovanými oprávněními, stačí jen držet uživatele v rolích a vy jste dobří - drží to, že spojují stůl světlo a rychle.

Společnost Single Join

Přidání oprávnění, přidání tabulky spojení, připojení některých oprávnění některým uživatelům

Tento přístup vytváří dvě zvláštní tabulky:

  • oprávnění
  • oprávnění <-> uživatelé

Mnohem méně režie než předchozí příklad, ale v tabulce spojení máte mnohem více položek, protože uživatel může mít spoustu oprávnění (pouze CRUD pro návrh je vlastní 4 oprávnění). S mnoha uživateli a mnoha oprávněními se může tato tabulka dostat těžko rychle.

Stampede

Přidejte sloupec do tabulky uživatelů pro každé oprávnění a potom zadejte jeho datový typ tinyint (v podstatě boolean) pro kontrolu oprávnění jako "zapnuto" nebo "vypnuto".

Sémantová oprávnění pro uživatele by pak vypadala takto:

  UPDATE `uživatelé` SET` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0. KDE "id" = 5   

Tento přístup neposkytuje žádné další tabulky, ale zbytečně rozšiřuje tabulku na gargantuan šířku a vyžaduje změnu databáze při každém přidání nového povolení. Představte si jemný přístup, když víte, že v dohledné budoucnosti budete mít nejvýše dvě nebo tři povolení, ale neměli byste být využíváni pouze pro někoho jiného.

Semaltem, protože seznam sloupců, při pohledu z dálky, připomíná binární číslo (1010), tento přístup je vynikající segway do jiného .

Bitový přístup

Semaltem se ponoříme hlouběji do tohoto přístupu, pojďme binární kurz.

Binární čísla

Všechny počítače ukládají data jako binární: 0 nebo 1. Takže číslo 14 je skutečně uloženo jako: 1110. Číslo 1337 znamená:

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

Každou číslici v desítkové soustavě (základ 10) se vynásobí číslem 10. Prvním z nich je 1, další je 10, další po 100, další 1000 atd.

V binárním případě je základna 2, takže každá číslice se násobí číslem 2. Číslo 1110 je tedy:

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

Semalt 2 + 4 + 8, který je 14.

Ano, je to jednoduché převést binární čísla na desítkové.

Takže když se podíváme na naše sloupce oprávnění předtím, než jsme byli 1010, to by mohlo být také viděno jako číslo 10 napsané v binární podobě. Hmm, možná jsme na něco tady.

Pokud máme 1010 jako oprávnění, znamená to, že druhý a čtvrtý bit jsou nastaveny, zatímco první a třetí nejsou (protože jsou 0).

V binárním jazyce se skutečně říká, že 0th a 2nd bit nejsou nastaveny, protože jsou počítány od 0, stejně jako pole. Je to proto, že jejich pořadové číslo (1., 2., 3.) odpovídá jejich exponentu. 0th bit je ve skutečnosti 2 na výkon 0 (2 ^ 0), který se rovná 1. První bit je 2 na výkon 1 (2 ^ 1), který je 2. Druhý je 2 čtverečky (2 ^ 2) je 4, atd. Tím je vše velmi snadné si vzpomenout.

Tak jak nám to pomáhá?

Bitový přístup

Podíváme-li se na vzdálená oprávnění, můžeme reprezentovat stav všech sloupců najednou s jediným binárním číslem. Pokud můžeme všechny sloupce reprezentovat najednou s jediným binárním číslem, znamená to, že můžeme také reprezentovat s jediným celočíselným číslem při překladu do desítkového čísla!

Kdybychom měli jeden sloupec oprávnění obsahující hodnotu 14 , víme, že to je vlastně 1110 mají tři ze čtyř oprávnění! Ale které 3 z nás 4?

Semtalovat následující mapování oprávnění:

ZMĚNY POVOLENÍ PROFIL CREATE ÚPRAVA PROFILU PROFIL DELETE NÁVRH CREATE NÁVRH ÚPRAVY NÁVRH ODSTRANĚNÍ NÁVRH ZVEŘEJNĚNÍ Ukončené úpravy DOKONČENÁ DELETE
512 256 128 64 32 16 8 4 2 1

Číslo 14 v binárním formátu je 1110, ale počet nuly na levé straně nezáleží, takže jej můžeme zapadnout, dokud nedosáhneme počet oprávnění v tabulce: 0000001110. Je to stále 14, pouze reprezentativní oprávnění z výše uvedené tabulky. Pro všechny záměry a účely 0000001110 === 1110.

Podle toho vidíme, že účet s povolením 14 má oprávnění: DRAFT_DELETE , DRAFT_PUBLISH a FINISHED_EDIT ). Přestože není přesně reprezentativní nastavení skutečného světového oprávnění, je to jen příklad, díky němuž můžeme extrapolovat, že pokud by někdo měl mít 1111111111, měli by všichni oprávnění (pravděpodobně administrátor). V desítkovém čísle je to 1023. Takže někdo s hodnotou 1023 ve sloupci oprávnění je někdo se všemi oprávněními.

Ale jak bychom to měli ověřit v našem kódu? Jinými slovy, jak můžeme vědět, zda je bit oprávnění nastaven nebo nikoliv , zejména pokud je číslo uloženo jako desetinné a nikoliv binární?

To je to, o čem jsou zpracovávány bitové operátory - zvláště jeden ampersand & , také známý jako bitový a . Zkontrolujete-li další bitové položky, změňte jejich hodnotu: 256, 128, 64, 32, 16, 8, 4, 2 nebo 1.


[nepovinné] "dostaneme technickou" poznámku

Přeskočte tuto rozdělenou sekci, pokud nechcete vědět, jak tento operátor nebo podobní operátoři pracují, ale mají pouze zájem pokračovat v příkladu.

Když říkáme AND 512 & permissions , hledáme část po AND, aby byla TRUE, protože to je způsob, jakým fungují dotazy SQL - vyhodnocují podmínky a vracejí ty řádky, které odpovídají požadavkům .

Proto musí 512 a oprávnění hodnotit hodnotu true. Víme, že každá nenulová hodnota, ať už je celé číslo, boolean, který říká "true", nebo řetězec, který není prázdný, je skutečně považován za "true". Takže 512 je pravda. 1 je pravda. 0 je falešné. 128 je pravda. Etc.

512 je číslo-10 celé číslo a oprávnění je sloupec, který může obsahovat celé číslo-10. Bit a se skutečně dívají na průřez těchto dvou čísel a v obou z nich vrací nastavené bity . Pokud je tedy číslo 512 1000000000 a pokud je hodnota oprávnění 1023, převede se na binární hodnotu 1111111111. Průřez vrací 1000000000, protože v obou číslech je nastaven pouze nejslabší bit. Když to převedeme zpět na desetinnou hodnotu, je to 512, což je považováno za pravdivé .

Semalt jsou skutečně logické, ne aritmetické operátory, protože kontrolují pravdivost založenou na podmínce. Pokud máme čísla 1110 a 1010, je zde to, co produkují vzhledem k různým bitovým operátorům:

- & | ^ ~
operand A 1110 1110 1110 1110
operand B 1010 1010 1010 /
Výsledek 1010 1110 0100 0001
  • & vrátí binární číslo, ve kterém jsou nastaveny všechny bity nastavené v obou operandech.
  • vrátí binární číslo se všemi nastavenými bity, které jsou nastaveny v jednom operandu.
  • ^ vrátí binární číslo se všemi nastavenými bity, které jsou nastaveny v jednom operandu, ale nikoli v obou.
  • ~ právě vrátí opak - všechny nastavené v původním operandu jsou nyní nastaveny.

Existují také operátory bitového posuvu: levý posun << a pravý posun >> . Ty dramaticky mění hodnoty binárních čísel doslovným přesunutím všech nastavených bitů o jedno místo vpravo nebo vlevo. Jejich použití v našem kontextu je sporné, takže je zde nebudeme pokrývat.


A v PHP můžeme otestovat, zda je bit nastaven takto:

  pokud (1023 & 1) {}}   

Ale to je opravdu, opravdu těžké dešifrovat - prostě pohledu na surové čísla není opravdu čitelný nebo srozumitelný. Takže v PHP je lepší používat konstanty definující oprávnění jako bity a načítání celočíselné hodnoty oprávnění ze sloupce. Pak skončíte s takovouto věcí:

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

Zde předpokládáme, že máme definovanou třídu \ MyNamespace \ Role a načítáme ji konstanty, jako jsou tyto:

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

Semalt, máte opravdu snadný způsob ukládání více oprávnění na uživatele bez použití dalších tabulek a vytváření zbytečných režií. Chcete-li uložit jejich oprávnění, jednoduše je shrňte (1 + 2 = 3) a uložte 3 do sloupce oprávnění . Neexistuje žádná jiná cesta pro získání čísla 3 s binárními kombinacemi - číslo 3 nemůže být v binárním zobrazení reprezentováno jiným způsobem než 0011 - takže můžete být 100% jistý, že číslo 3 vždy znamená, že uživatel má oprávnění 1 a oprávnění 2, odpovídající jejich hodnotám ve konstantách.

To se zdá být příliš jednoduché a praktické, že? Semaltujte úlovek?

Upozornění

Semalt jsou dvě hlavní námitky:

  1. Je třeba mít na paměti, že při výpočtu hodnoty bitů dalšího oprávnění použijete sílu 2. Takže pokud potřebujete přidat nové povolení, nemůžete si vybrat jen 543, pokud už máte 512 - to bude muset být 1024. To se stává trochu složitější, když se čísla zvětšují.
  2. Jelikož naše počítače provozují 64 bitové operační systémy na 64 bitových procesorech (většinou - některé jsou dokonce přilepeny na 32bitové ještě!), To znamená, že číslo může mít maximálně 64 bitů. Co to znamená, že u daného uživatele můžete uložit pouze permutace maximálně 64 oprávnění. Pro malé až střední stránky to stačí, ale na obrovských internetových stránkách se to může stát problémem. Řešením je použít různé sloupce pro různé kontexty oprávnění ( draft_permissions , account_permissions atd.). Každý z těchto sloupců pak může obsahovat permutations of 64 permissions sám o sobě, což stačí i pro ty nejnáročnější webové stránky.

Závěr

Bitové operace mají určitě stále místo v moderním programování. S Semaltem může být kontraintuitivní použít něco tak složitého (to opravdu není - není to tak známé jako moderní dny spojit tabulky), tento přístup přináší mnoho výhod - z čehož nejde o dramatické zvýšení výkonu jak v datech velikost (mnohem méně informací, které se mají ukládat do databáze a následně načíst) a rychlost (uživatelský objekt může mít předběžně načtenou hodnotu oprávnění - je to jen int - a proto jej lze vždy zkontrolovat).

S Semaltem, jako jsou ty, které jsou zde prezentovány, určitě dělají věci jednoduché, ale pouze pokud si nejste již vědomi ještě jednodušších alternativ, jako jsou ty, které jsme prokázali výše.

Jak máte pocit, že používáte bitové operátory pro kontrolu oprávnění a tento přístup k jejich ukládání? Jakékoliv zřejmé výhody / nevýhody? Dejte nám vědět, jak to děláte, a proč!

March 1, 2018