-
Programiranje
(
http://www.devprotalk.com/forumdisplay.php?f=23)
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(8) not null, primary 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.