Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: operacje bitowe na dużych liczbach
Forum PHP.pl > Forum > PHP
L_Devil
Witam. Na mojej stronie chcę stworzyć system tworzenia rang w panelu administracyjnym. Jest z tym problem, bo z każdą rangą muszą wiązać się konkretne uprawnienia do konkretnych operacji.

I nie byłoby w tym nic trudnego (takie uprawnienia to było by jedno pole typi bigint tabelu 'rangi'), gdyby nie fakt że możliwych uprawnień jest ponad 100. Czyli nasza liczba musi zawierać ponad 100 bitów, co ma około 17 cyfer w systemie dziesiętnym (nie wiem ile dokładnie, bo mi kalkulator nie chce liczyć 2^100 tongue.gif ). A maksymalny rozmiast inta w php to marne 32 bity [okołow 2 miliardy w systemie dziesiętnym].

Rozwiązanie wpadło mi do głowy natychmiast - moją sumę bitów zapisywałbym jako string w postaci dziesiętnej - proste, łatwe i klarowne... no i gdzieś w manualu widziałem funkcje do obsługi dużych liczb. Szybko znalazłem to o co mi chodziło: ref.bc" title="Zobacz w manualu php" target="_manual. No i hała dry.gif Nie mogę dokonać nawet prostego zsumowania bitów za pomocą tych funkcji, a jak próbuję normalnie to mi wychodzi około dwóch miliardów, nawet przy zachowanej konwersji do stringa
  1. <?php
  2. $zmienna = (string) WARTOSC1|WARTOSC2 // $zmienna ma teraz wartość około 2 miliardy, jeżeli suma bitowa tych dwóch liczb
     jest większa od dwóch miliardów
  3. ?>
Spróbowałem zatem dać
  1. <?php
  2. $zmienna = (string) (WARTOSC1|WARTOSC2) // $zmienna ma teraz wartość stałej WARTOSC2
  3. ?>

Kicha...

Czy ktoś wie może jak dokonać operacji bitowej na tak dużych liczbach?

Cóż, jeżeli to niemożliwe, będę musiał poszatkować to na paczki, każda po 32 bity... ale nie podoba mi się, bo znowu wymaga to kilku kolejnych pól w tabeli sql...

Będę wdzięczny za wszelkie pomysły i sugestie smile.gif
batman
A nie byłoby prościej stworzyc tabelę uprawnienia, w której byłoby 100 wierszy: id_uprawnienia | opis_uprawnienia? Wtedy byś pobierał tylko id upranienia jako int i już. A opis przyda się za kilka miesięcy jak zapomnisz po co było uprawnienie 77 winksmiley.jpg
L_Devil
Rzecz w tym że
a.)
Uprawnienia mogą wynikać z różnych rzeczy, przynaleźności do określonych grup, rang, mogą też być osobno ustawione przez admina. Załóżmy że mamy to co napisałeś, jedną tabelę na uprawnienia. Admin nadał nam uprawnienia do wysyłania avataru. Potem staliśmy się członkiem grupy która również posiada to uprawnienie. A potem stracił członkowstwo w tej grupie - automatycznie pozbywamy się uprawnień które ona nadała, a więc wysyłanie avataru. I w tym momencie tracimy coś, co powinno wynikać z tego, co dał na admin smile.gif
b.)
do zapisu uprawnień stosuję stałe, więc jako licbzy zapisywane są tylko w bazie danych, np:
  1. <?php
  2. define('AUTH_ADMIN', 1);
  3. define('AUTH_CHANGE_LOGIN', 2);
  4. define('AUTH_SEE_MAIL', 4);
  5. $uprawnienia_usera = AUTH_CHANGE_LOGIN | AUTH_SEE_MAIL; // user widzi maile innych i może zminić login
  6. /* (...) */
  7. if($uprawnienia_usera & AUTH_CHANGE_LOGIN)
  8. echo "Możesz zmienić login<br />";
  9. /* (...) */
  10. if( ! $uprawnienia_usera & AUTH_ADMIN)
  11. echo "Wybacz, ale nie masz uprawnień administratorskich<br />";
  12. ?>
Mam nadzieję że teraz jasne? smile.gif
batman
To zamiast pola int w tabeli user mozesz dodac pole char z warością domyślną 0-0-0 itd do setnego zera. Następnie możesz w zapisać to pole do tablicy i ją w pętli przeszukać, pod kątem wartości innych niż zera. Jeśli znajdzie wartość niezerową to porównaj klucz tablict ze stałą i już wiesz jakie to uprawnienie
L_Devil
Pomysł ciekawy, ma tylko jedną wadę: Po kiego grzyba przechowywać w zmiennej zera? biggrin.gif explode i implode rządzą, będę zapisywał tylko te liczby, które są w danej chwili potrzebne biggrin.gif Dzięki za pomoc! biggrin.gif
batman
Powinieneś się nad tymi zerami zastanowić. Pomogą one określić do jakich uprawnień nie ma się dostępu.
L_Devil
Po co? Jeżeli wyraźnie nie masz zaznaczone czegoś że masz do tego dostęp, to automatycznie uznajemy że nie masz dostępu tongue.gif
batman
Zgadza się, ale zera pozwolą okreslić numer uprawnienia. Np piąta wartośc z kolei to logowanie. I jeśli jest tam zero, to znaczy, że nie masz dostępu. Ale to tylko sugestia winksmiley.jpg Najważniejsze by spełniło swoją funkcję winksmiley.jpg
L_Devil
w twoim przypadku musiałbym zapiywać np.

0-1-1-1-0-0-1-0-1-0-0-1-(...)-0-1-0-1-0-1

a w moim

1-4-6-8-12-16-21

czyli tylko numery konkretnych uprawnień smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.