Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [funkcja] generowanie unikalnego id, PHP 4, 5
Sokal
post
Post #1





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 8.02.2007

Ostrzeżenie: (10%)
X----


Napisałem tą funkcję na potrzeby jednego projektu, może się komuś przyda (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?php
  2. /**
  3.  * create_id() - tworzenie unikalnego ID
  4.  * 
  5.  * @author Dominik Sokal
  6.  * @param array $ids
  7.  * @return string
  8.  */
  9. function create_id($ids = array())
  10. {
  11. $id = md5(mt_rand());
  12. if(in_array($id, $ids))
  13. {
  14. return create_id($ids);
  15. }
  16. return $id;
  17. }
  18. ?>


Funkcja ta generuje unikalne ID.

Ten post edytował Sokal 30.06.2007, 19:03:29
Go to the top of the page
+Quote Post
kwiateusz
post
Post #2


Admin Techniczny


Grupa: Administratorzy
Postów: 2 072
Pomógł: 93
Dołączył: 5.07.2005




gdyby nie globał byłoby całkiem fajnie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) zamiast tego powinieneś zrobić że do funkcji przekazuje się tablice z już zrobionymi id (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

i zamiast foreach in_array" title="Zobacz w manualu PHP" target="_manual

no i może zamiast rand mt_rand" title="Zobacz w manualu PHP" target="_manual bo jak w manualu piszą działa szybciej i lepsze liczby tworzy (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) (to już tylko takie czepialstwo po lekturze manuala (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) )
Go to the top of the page
+Quote Post
Sokal
post
Post #3





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 8.02.2007

Ostrzeżenie: (10%)
X----


Co Ci się nie podoba w globalu?

// Już chyba wiem (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
// A co do foreach, skopiowałem nie z tego pliku co trzeba.
// Teraz to już się chyba nie czepisz (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) A może? Trzeba zobaczyć czy sha1() działa szybciej (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował Sokal 30.06.2007, 17:59:37
Go to the top of the page
+Quote Post
kwiateusz
post
Post #4


Admin Techniczny


Grupa: Administratorzy
Postów: 2 072
Pomógł: 93
Dołączył: 5.07.2005




do array_search (IMG:http://forum.php.pl/style_emoticons/default/happy.gif) bo to zwraca numer klucza pod którym występuje znaleziony wpis, a starczy samo in_array które sprawdza czy wpis istnieje w tablicy czy nie i zwraca tylko true/false (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

jak sie czepiać to sie czepiać (IMG:http://forum.php.pl/style_emoticons/default/happy.gif)
Go to the top of the page
+Quote Post
webriddles
post
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 6.12.2009

Ostrzeżenie: (0%)
-----


Witam! Chciałbym użyć tej funkcji u siebie na stronie, ale pojawił się pewien problem. Mianowicie, system rejestracji mam oparty na MySQL i chciałbym teraz aby najpierw skrypt pobierał dane z pola "ID" w bazie, te dane zamieniał potem na tablicę, a następnie sprawdzał według w/w kodu. Mój problem polega na tym, że skrypt często wywala błąd "Wrong datatype for second argument", czyli nie zgadza się tablica utworzona z danych pobieranych z MySQL. Prosiłbym o pomoc.
Go to the top of the page
+Quote Post
mrok
post
Post #6





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

Ostrzeżenie: (0%)
-----


a nie latwiej tak uniqid()
Cytat
uniqid

(PHP 4, PHP 5)

uniqid — Generate a unique ID
Go to the top of the page
+Quote Post
blooregard
post
Post #7


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




To teraz ja się "czepnę":

Fragment z dokumentacji dla mt_rand() ( http://pl.php.net/mt_rand )
Cytat
Jeśli funkcja zostanie wywołana bez opcjonalnych argumentów min i max , funkcja mt_rand() zwróci liczbę pseudolosową z przedziału pomiędzy 0 a RAND_MAX.


Cytat
Funkcja ta generuje unikalne ID.

Otóż nie unikalne. Generator liczb losowych, jeśli ma określony zakres, zawsze MOŻE wygenerować Ci jakąś wartość ponownie, co oznacza, że ID już nie będą unikalne (bo będą się powtarzać).
RAND MAX z kolei ma wartość, którą można odczytać przy pomocy f-cji getrandmax() - jest to 32767. Czyli mamy 32768 kmbinacji. Troszkę mało (IMG:style_emoticons/default/smile.gif)

Ale mam dla Ciebie rozwiązanie - dodawaj do wygenerowanej przez mt_rand() wartości wynik zwracany przez microtime() (UNIX-owy znacznik czasu wraz z mikrosekundami - 1000 unikalnych wartości w ciągu sekundy). Wtedy dochodzi Ci stale zmieniający się (i naprawdę unikalny - czas nie biegnie w dowolną stronę (IMG:style_emoticons/default/smile.gif) ) czynnik i będzie prawie idealnie (IMG:style_emoticons/default/smile.gif)



Go to the top of the page
+Quote Post
webriddles
post
Post #8





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 6.12.2009

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedzi (IMG:style_emoticons/default/smile.gif) Nie potrzebuję dużo kombinacji bo użytkowników będzie max. 500. Wkleję tutaj fragment kodu, który zrobiłem.
  1. $query = mysql_query("SELECT `gid` FROM `rejestracja`");
  2. while ($row =mysql_fetch_assoc($query)) {
  3. $array[] .= $row['gid'];
  4. }
  5.  
  6. function gen_id(){
  7. for($n=1; $n<5; $n++){
  8. $gid .= mt_rand(0,9);
  9. }
  10. return $gid;
  11. }
  12. if(in_array($id, $array)){
  13. gen_id();
  14. }
  15.  
  16. echo $gid;


No właśnie, może mi ktoś powiedzieć co robię tutaj źle?
Go to the top of the page
+Quote Post
Meares
post
Post #9





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Chwila... Chcesz generować id dla użytkowników, których trzymasz w bazie danych? Jeśli tak to czemu nie skorzystasz z "AutoIncrement"?
Go to the top of the page
+Quote Post
webriddles
post
Post #10





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 6.12.2009

Ostrzeżenie: (0%)
-----


Bo to tworzy kolejne liczby które mogę się składać z jednej cyfry. Ja potrzebuję 4-cyfrowego numeru, który będzie wysyłany automatycznie mailem podczas rejestracji.
Go to the top of the page
+Quote Post
Meares
post
Post #11





Grupa: Zarejestrowani
Postów: 102
Pomógł: 13
Dołączył: 16.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


  1. function genid() {
  2. $array = str_split(rand(10000000, 99999999));
  3. return $array[rand(0, 7)].$array[rand(0, 7)].$array[rand(0, 7)].$array[rand(0, 7)];
  4. }

Wątpię by się powtórzyły, przynajmniej nie szybko. (IMG:style_emoticons/default/smile.gif)

Ten post edytował Meares 7.01.2010, 12:40:48
Go to the top of the page
+Quote Post
pgrzelka
post
Post #12





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Cytat(webriddles @ 7.01.2010, 12:28:18 ) *
Bo to tworzy kolejne liczby które mogę się składać z jednej cyfry. Ja potrzebuję 4-cyfrowego numeru, który będzie wysyłany automatycznie mailem podczas rejestracji.


myślę że dobrym rozwiązaniem będzie ustawienie w bazie auto_increment od 1000,

ps. 4 cyfry trochę Cię ograniczają (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
phpion
post
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(pgrzelka @ 7.01.2010, 14:19:45 ) *
myślę że dobrym rozwiązaniem będzie ustawienie w bazie auto_increment od 1000,

Albo ZEROFILL.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.12.2025 - 13:51