![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Hej,
Muszę zrobić w panelu adminisracyjnym strony możliwość generowania kodów dostępu. Use case: Użyszkodnik loguje się -> podaje ilość kodów do wygenerowania -> dostaję listę kodów -> akceptuje i są one zapisywane w bazie / lub nie Zastanawia mnie jak zrealizować generator. W przypadku jeśli ma zostać wygenerowanych powiedzmy 1000 kodów to trochę mało wydajnym wydaje się być generowanie ich z poziomu PHP i sprawdzanie każdego czy już taki istnieje. Rozważałem generowanie ich przez sh1() bądź md5() z jakiegoś wewnętrznego identyfikatora, ale wtedy wychodzą one trochę za długie. Nie chciałbym żeby miały one więcej niż 9 znaków. W ogóle to najchętniej całą odpowiedzialność za ich generowanie przerzuciłbym na bazę danych tylko pisanie po to procedury składowej której czas wykonania będzie taki sam jak ewentualnego rozwiązania w skrypcie mija się trochę z celem bo baza jest na tej samej maszynie. Jestem otwarty na wszelkiego rodzaju pomysły i sugestie. Dzięki |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Możesz na przykład stworzyć w bazie tabelę z gotowymi kodami, które zostały wygenerowane wcześniej i sprawdzone pod kątem unikalności (zresztą wystarczy nałożyć na kolumnę z kodami parametr UNIQUE dla 100% pewności). A samo generowanie kodów to już wolna amerykanka.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie masz się o co martwić o wydajność przy generowaniu raptem 1000 kodów. Napisz tylko dokładnie jakie jeszcze warunki muszą spełnić te kody, bo wspominasz coś o unikalności, ale nie podałeś dokładnie jakiej.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Skoro potrzebujesz powiedzmy 9 znaków a md5 ma ich 32 to substr i sobie wytnij ze środka 9 znaków.
@down Oczywiście, jakoś z rozpędu dałem _ Poprawione Ten post edytował Fifi209 15.10.2011, 14:09:34 -------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli już to substr. Ja kiedyś wycinałem z md5 fragment rozpoczynając od losowej pozycji. Możesz też zrobić sobie tablicę z dopuszczalnymi znakami i w pętli for dodawać do łańcucha znaków losowe elementy tej tablicy - wtedy masz pełną losowość.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 15.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Ja jak muszę wygenerować jakieś losowe ciągi to korzystam zawsze z jednej niezawodnej funkcji.
Małe znaki są wyłączone bo ja akurat ich nie potrzebowałem ostatnio jak używałem tej funkcji, wystarczy usunąć "//". Małe L usunięte żeby się nie myliło z 1. To samo z O i 0. Zawsze można dodać z powrotem jeżeli się używa czcionki gdzie można odróżnić te podobne do siebie znaki. I do tego można dodać zwykłą pętlę generującą i dodającą kody do bazy
No nie ma 100% gwarancji że nie wygeneruje się taki sam kod. Jest bardzo mało prawdopodobne, ale rzeczywiście można to zabezpieczyć nadaniem UNIQUE na kolumnę "kod". Ten post edytował CMG 15.10.2011, 13:19:22 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 306 Pomógł: 42 Dołączył: 25.03.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
W moim kodzie wygenerowanie 10k 9-znakowych tokenów trwało niecałą sekundę, więc o wydajność nie martwiłbym się. ;p
Potrzebowałem ostatnio czegoś takiego na szybkości, że tak powiem.
Użycie:
Ważne, że spełnia swoją rolę. ;P Edit: tamten był oczywiście niepoprawny, teraz jest 'wydajniejszy'. Ten post edytował qrooel 15.10.2011, 22:29:00 -------------------- Strony WWW: http://arscreo.pl
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Zamiast kombinować: uniqid
Co do Twojej "klasy": Działa błędnie. Pierwszym błędem jest warunek:
Skoro liczysz od zera a podajesz 9 to nie wygeneruje 9 tylko 10 znaków. Ten post edytował Fifi209 15.10.2011, 14:16:56 -------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Możesz na przykład stworzyć w bazie tabelę z gotowymi kodami, które zostały wygenerowane wcześniej i sprawdzone pod kątem unikalności (zresztą wystarczy nałożyć na kolumnę z kodami parametr UNIQUE dla 100% pewności). A samo generowanie kodów to już wolna amerykanka. I tak właśnie mam w bazie jedno pole z kodem UNIQUE i jedno z datą dodania.Nie masz się o co martwić o wydajność przy generowaniu raptem 1000 kodów. Napisz tylko dokładnie jakie jeszcze warunki muszą spełnić te kody, bo wspominasz coś o unikalności, ale nie podałeś dokładnie jakiej. Samo generowanie to w sumie nie problem, ale jeśli mam sprawdzać istnienie każdego kodu w bazie za pomocą SELECT cośtam to wydajność może dostać mocnego kopa w jaja i to mnie właśnie trochę martwii. Dlatego szukam sposobu na generowanie tych kodów w jakiś ciągły sposób żeby wyeliminować konieczność sprawdzania ich istnienia w bazie.Skoro potrzebujesz powiedzmy 9 znaków a md5 ma ich 32 to substr i sobie wytnij ze środka 9 znaków. W tym wypadku wymagane będzie składowanie jakiegoś licznika i nie wiadomo w sumie jak tak wycięty ciąg znaków będzie się często powarzać. No w sumie można to też na microtime zamiast licznika zrobić.@down Oczywiście, jakoś z rozpędu dałem _ Poprawione Ja jak muszę wygenerować jakieś losowe ciągi to korzystam zawsze z jednej niezawodnej funkcji. Niemalże identycznego kodu używam do funkcji przypominania hasła, które jest potem wysyłane na adres email. (...) ![]() |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
qrooel - po co używasz powolnego shuffle tak wiele razy? Shuffle to shuffle - miesza całą tablicę. Do wybierania losowych elementów używa się array_rand.
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Nie musisz robić selectów przecież w ogóle. Zakładając, że dodajesz każdy oddzielnie i masz to unique to w przypadku, gdy wartość się powtórzy dostaniesz false.
-------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 306 Pomógł: 42 Dołączył: 25.03.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak jak pisałem, napisane szybko żeby działało. Wiadomo, że pasowałoby to poprawić. Co do array_rand -> oczywiście, że tak powinno się to zrobić. ;P
Ten post edytował qrooel 15.10.2011, 17:09:57 -------------------- Strony WWW: http://arscreo.pl
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Napisane na szybko? Pieściłeś się z tymi metodami do patternu jak z jajkiem, a podstawy kuleją.
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli musisz sprawdzać, to każda metoda będzie wymagała selectów.
-------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Generujesz 1000 kodów (możesz w sumie wygenerować sobie ich nieco więcej na poczet zduplikowanych).
2.
3. Usuwasz z tablicy wygenerowanych kodów te, które zwróciło zapytanie - array_intersect. 4. Jeżeli tablica ma ponad 1000 elementów przycinasz ją - array_slice. 5. Jeżeli tablica ma poniżej 1000 elementów powtarzasz całość łącząc na końcu starą i nową tablicę. |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie lepiej wsadzić do bazy jakieś milion unikalnych kodów samemu i dodać kolumnę określającą czy kod został użyty czy nie lub też bardziej wyrafinowane przypisywanie kodów do czegoś (co oznacza, że jest zużyty)?
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Swoją drogą, po co te kody?
-------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 306 Pomógł: 42 Dołączył: 25.03.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
qrooel - po co używasz powolnego shuffle tak wiele razy? Shuffle to shuffle - miesza całą tablicę. Do wybierania losowych elementów używa się array_rand. Poprawione. Faktycznie, na próbie w pętli wykonywanej 10000 razy shuffle wykonuje operację o prawie sekundę dłużej niż array_rand. -------------------- Strony WWW: http://arscreo.pl
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 20:47 |