A ko garantuje da će kompajler koristiti glibc implementacije funkcija rand i srand, a ne neke svoje? Da li će sve verzije glibc-a da imaju istu implementaciju?
Ma, kapiram ja tebe, samo može kraće i preglednije:
Mihajlo Cvetanović:
Kada se karakteri u stringu "9>AEFK" pomere za deset mesta dobijemo karaktere "CHKOPU", što su gle čuda sve karakteri u tvom imenu. Pretpostavljam da će rezultat rada programa biti tvoje ime.
Ali treba da znaš da rand funkcija nije standardizovana. Razni kompajleri proizvode različite rezultate za isti početni seed. Čak i isti kompajleri u različitim verzijama mogu da proizvedu različit rezultat. Zato, ono što funkcioniše kod tebe ne mora da funkcioniše kod nekog drugog.
Ovo je sample implementacija iz standarda:
Code:
static unsigned long int next = 1;
int rand(void) // RAND_MAX assumed to be 32767
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
Može li neko da mi objasni u čemu je smisao svega ovoga?
Za obfuskaciju izvornog koda u C-u postoje gotovi alati. Ako neko zna bolje metode, neka ih formuliše u vidu opšteg slučaja i to objavi i/ili napravi softver.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
A sto se tice rand i srand, toliko programera naokolo, dajte bar jedan primer drugacije implementacije rand i srand? To jest dajte neku platformu na kojoj kod nece raditi ono sto treba :))))))))))) Za sada samo pricate kako teoretski to nece raditi, a ni jedan prakticni primer kako ne radi :). Mada da se ne lazemo, meni je bitno da prodje sa gcc i clang :).
A evo i nesto ste novo naucili :))), a i definitno kod daje neocekivan rezultat :PPPP.
P.S. Nedeljko main(){puts("Paja Patak");} Jos je krace, ali treba znati c :)
Na svim koje su mi pale saka, mada skoro svuda je bio gcc ;). Ako vam iz prve radi na omiljenom c kompajleru, moze se reci da je tesko naci gde ne radi :). Ali ajde demantujte me, voleo bih da vidim tu implementaciju kompajlera/standardnih biblioteka.
U Visual C možeš da kompajliraš baš C, tako što ćeš da napraviš .c fajl. Može se kompajlirati iz komandne linije ili nekog IDE-a (može i Code::Blocks).
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Od kada se moze programirati na windowsu :))))))))))), inace dobra poenta sa razlicitikm libc implementacijama, moracu negde da probam jos na ulibc i dietlibc. Mada koliko vidim nece da radi, kada nisu POSIX implementacije :).
Deo man 3 rand:
Code:
POSIX.1-2001 gives the following example of an implementation of rand()
and srand(), possibly useful when one needs the same sequence on two
different machines.
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned int seed) {
next = seed;
}
I da, naravno da sam od samog pocetka znao da nece to bas biti prenosiv kod, ali eto radi bar negde :))). Ali ajde ozbiljno ko jos koristi rand iz libc-a za nesto ozbiljnije ;).
Ako mi zatreba ozbiljni random brojevi, koristim ono sto isporucuje OS, kako radim na linuxu samo, procitam /dev/random :), ili /dev/urandom ako je malo manje bitno :).
Naravno za neku ozbiljnu prenosiviju foru uzmem openssl/rand ako licenca zadovoljava potrebe :)
Trebaju mi pseudoslučajni brojevi koji ispunjavaju sledeće uslove:
1. da mogu da namestim seed i da dobijam deterministički proizvoljno dug niz,
2. da budu kriptografski sigurni,
3. da se generišu onoliko brzo koliko je to moguće.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.