Sad sam upravo generisao vektor od 2.000.000 celih pseudo-slučajnih brojeva sa opsegom [0..2^32-1] pomoću ove linije koda u MATLAB-u:
Kôd:
brojevi = randint(1, 2e6, 2^32);
Vreme izvršenja? Nešto malo više od 1 sekunde u virtuelnoj mašini.
Nešto sam malo kopao po MATLAB-ovom helpu ali nisam uspeo da nađem funkciju koja uklanja istovetne vrednosti iz vektora, tako da mogu da dam sledeći algoritam (mrzelo me da pišem kod) koji može biti prilično brži od vaših IMHO:
1. Pokrenemo MATLAB i u definišemo sledeće promenljive:
broj_kodova (broj jedinstvenih kodova koje želimo da generišemo),
multiplikator (generišemo s njim "rezervne kodove", uzmimo da je vrednost 2) i
faktor_ubrzanja (ubrzava dolazak do rešenja tako što poništava efekat nejedinstvenih kodova - uzmimo za vrednost 2)
2. Izvršimo
Kôd:
podaci = sprintf('%x\n', randint(1, broj_kodova*multiplikator, 2^32));
Ovim korakom ćemo automatski dobiti
broj_kodova*multiplikator kodova (u suštini su to 32-bitni brojevi u heksadecimalnoj reprezentaciji)
3. Izvršimo sledeći kod:
Kôd:
brojac = 1;
delta = broj_kodova;
4. Napravimo view
jedinsteni_kodovi u bazi koji se sastoji od
SELECT DISTINCT... SQL upita, tako da možemo jednostavnim brojanjem redova u view-u da saznamo koliko imamo jedinstvenih kodova, i hajde da kažemo da tu vrednost čuvamo u
broj_jedinstvenih_kodova
5. Uradimo bulk insert
podaci(brojac:delta+brojac-1, :) kodova u bazu (MATLAB podržava da se bulk insert izvrši jednim pozivom
insert() funkcije)
6. Učitamo novu vrednost promenljive
broj_jedinstvenih_kodova
7.
Kôd:
brojac = delta+brojac;
delta = (broj_kodova - broj_jedinstvenih_kodova) * faktor_ubrzanja;
8. Ako je
delta > 0 onda se vraćamo na korak 5
9. Iz view-a povadimo
broj_kodova redova i to smestimo u neku tabelu/dump/neki-drugi-izvor-podataka.
10. Pokrenemo, protegnemo se, popijemo kaficu i gotovo ;)
I have way too much free time on my hands :D