DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Programiranje (http://www.devprotalk.com/forumdisplay.php?f=23)
-   -   Generisanje random UNIQUE kodova (http://www.devprotalk.com/showthread.php?t=588)

bluesman 01. 02. 2006. 23:34

Generisanje random UNIQUE kodova
 
Script treba da generiše 2 miliona kodova. Svi moraju biti unique, svi imaju dužinu od 8 karaktera, koriste se samo mala slova i cifre, ne smeju da budu u bilo kakvom redosledu. Znači, primer jednog koda je: a39sdk2b

Sve to može da se generiše u lokalu, ne mora ništa real time, sada razmišljam kako da uradim to najbrže. Sam PHP kod nije problem, jedini mi je mali "problem" kako da budem siguran da nema duplikata.

Moja ideja je da napravim jednu mysql tabelu koja će imati samo jednu kolonu koja je definisana kao primary key. Na primer ovako:

PHP kôd:

create table kodovi kod char(8not nullprimary key (kod)); 

Script će generisati kod, upisivati u tabelu, na svaki mysql error, on će da generiše ponovo taj kod sve dok ne prođe bez "duplicate key" greške i tek onda ide na sledeći u petlji. Kasnije samo uradim dump te tabele u bilo koji format i isporučim spisak od 2 miliona kodova.

Da li neko može da se seti nekog bržeg ili jednostavnijeg rešenja? Ne mora čak da bude ni PHP, može i iz Windows Paint ako treba :)

MorenoArdohain 01. 02. 2006. 23:40

Uvek moze brze :)
Napravi petlju koja generise te kodove, ali rezultate smesti u memoriju, u niz..
Pa tek onda sruci sav array u bazu

bluesman 02. 02. 2006. 00:07

I ako ima duplikata moram da prebrojim koliko je stvarno upisano, pa onda da generisem ponovo ostatak i tako dok ne popunim svih 2 miliona? Imao sam ideju da to uradim jednim izvrsenjem scripta :)

noviKorisnik 02. 02. 2006. 00:13

http://www.php.net/in_array
jedan niz, jedna petlja, jedan random generator, jedan brojač koji se povećava kad nova vrednost već nije u nizu

samo isključi time limit, nemam predstavu koliko to može da traje

// eh, da - koji jezik je u pitanju?

bokacbl 02. 02. 2006. 00:13

Citat:

Originalno napisao bluesman
I ako ima duplikata moram da prebrojim koliko je stvarno upisano, pa onda da generisem ponovo ostatak i tako dok ne popunim svih 2 miliona? Imao sam ideju da to uradim jednim izvrsenjem scripta :)

pa postavis da to radi u while petlji sve dok ne dobijes potreban broj kodova i povecavas counter nakon svakog uspjesnog upisa...mozda

Petar Marić 02. 02. 2006. 00:25

Najbrže? Najbolje?
1. Pa, za početak ključ od 8 karaktera je u stvari heksadecimalan prikaz 32-bitnog neoznačenog broja.
2. Tako kodiran ključ ima šansu pogotka od 1:2147,483648.
3. Za generisanje samih 32-bitnih brojeva iskoristi specijalizovani softver za numeričke proračune tipa MATLAB. Mislim da se u MATLAB-u da jednostavno napisati funkcija (tj, ako već ne postoji) za generisanje vektora jedinstvenih pseudo-slučajnih brojeva

Paranoik si i ne veruješ pseudo-slučajnim brojevima? Poveži mikrofon na ulaz zvučne kartice, meri beli šum i koristi njegovu numeričku reprezentaciju kao slučajni broj. Takođe povećaj širinu broja na 64 bita i uradi konverziju bajt u karakter koda po svom ukusu.

A onda, možda ipak ja samo previše teoretišem pred ispit iz Numerike :D

MorenoArdohain 02. 02. 2006. 00:30

Da, napravis petlju koja generise unique i proverava da li vec postoji u nizu, ako NE postoji, povecas counter...

Nesto kao

do
{
$broj=generisi_broj();
if (!in_array($broj, $niz)) { $counter++; $niz[] = $broj;}
} while ($counter<2000000);

Ovo je odoka.. Valjda radi..

Ilija Studen 02. 02. 2006. 00:37

Preterujete. Rešenje koje je bluesman predložio je jednostavno, da se brzo napraviti i odradiće posao dok si rekao piksla.

1 x PK ili UNIQUE kolona
1 x brojač
1 x while loop
1 x generator koda

Zbućkati, izvršiti i to je to. Pre ili kasnije ćeš morati podatke insertovati tako da baratanje nizom vidim kao suvišan korak. Nije neka ušteda, a pošto se radi samo jednom stvarno ne vidim zašto bismo pravili toliku nauku.

Edit: moja greška. Pomislio sam da su podaci potrebni u bazi, ne u drugom (bilo kom) obliku.

bluesman 02. 02. 2006. 00:41

Petre, idi odspavaj malo :)

Ja ipak ne bih da smeštam 2 miliona kodova u memoriju pa onda da čuvam u file, to će potrajati i ako pukne, moram ponovo... nesigurno je.

Milos Vukotic 02. 02. 2006. 00:44

Citat:

Originalno napisao MorenoArdohain
Da, napravis petlju koja generise unique i proverava da li vec postoji u nizu, ako NE postoji, povecas counter...

Nesto kao

do
{
$broj=generisi_broj();
if (!in_array($broj, $niz)) { $counter++; $niz[] = $broj;}
} while ($counter<2000000);

Ovo je odoka.. Valjda radi..

Moze i ovo Morenovo (osim sto treba $niz[$counter] = $broj]; ) samo da se u istoj while petlji negdje 'snima' dobijeni kod, a niz da sluzi samo za kontrolu. Sve pod uslovom da je in_array brzi od mysql-a :)


Vreme je GMT +2. Trenutno vreme je 01:00.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.