Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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 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


--------------------
Jabber/E-Mail: dominiksokal[at]gmail.com | GG: #3795571
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
kwiateusz
post
Post #2


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




gdyby nie globał byłoby całkiem fajnie smile.gif zamiast tego powinieneś zrobić że do funkcji przekazuje się tablice z już zrobionymi id 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 tongue.gif (to już tylko takie czepialstwo po lekturze manuala 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 tongue.gif
// A co do foreach, skopiowałem nie z tego pliku co trzeba.
// Teraz to już się chyba nie czepisz tongue.gif A może? Trzeba zobaczyć czy sha1() działa szybciej tongue.gif

Ten post edytował Sokal 30.06.2007, 17:59:37


--------------------
Jabber/E-Mail: dominiksokal[at]gmail.com | GG: #3795571
Go to the top of the page
+Quote Post
kwiateusz
post
Post #4


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




do array_search 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 tongue.gif

jak sie czepiać to sie czepiać 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 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ę smile.gif ) czynnik i będzie prawie idealnie smile.gif





--------------------
Life's simple... You make choices and don't look back...
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 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"?


--------------------
manual mmocenter
Nie pomagam na PW!
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. smile.gif

Ten post edytował Meares 7.01.2010, 12:40:48


--------------------
manual mmocenter
Nie pomagam na PW!
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ą 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:09