Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [funkcja] generowanie unikalnego id
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Sokal
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.
kwiateusz
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)
Sokal
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
kwiateusz
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
webriddles
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.
mrok
a nie latwiej tak uniqid()
Cytat
uniqid

(PHP 4, PHP 5)

uniqid — Generate a unique ID
blooregard
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



webriddles
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?
Meares
Chwila... Chcesz generować id dla użytkowników, których trzymasz w bazie danych? Jeśli tak to czemu nie skorzystasz z "AutoIncrement"?
webriddles
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.
Meares
  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
pgrzelka
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
phpion
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.
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-2024 Invision Power Services, Inc.