________________________________________________________________ ____ __ __ / ___________________________________________________________ ____ __ _ / ` \ / \[O3]/ + ,\_____ ___/ . ` |\/ , \__/ . \____ /:/=[ un affaire de NAS ] =\:\ _____/ ` x || , . " :X \_______________________________ ____ ____ / , ` ` || + , () . x , . ` ' ` \_ \ ,\\_ +\_ \ 'M ` | . || ` | ` , ` , + , ` ,--, + . \\_ \_ \ , \\_ K -+- / |+ -+- . , ` , ,',/ ,'. \_ \ . \\_ \_ \ - | ` / . | ; + + . ` | : . :`` ,_): ' ` \\_ \_ \ \\_` 1 , / ` . . x , .-=+=- `. ,. ,' ` , \_ \ + \\_` \_ \ 1 /\_____ x ' , . . X | ` `--' ` ` \\_ \_ \ , \\_ 1 + \\_ \___________________ , . . ` , + ' , , ; x ._\ \___\\___\ \ . \_ \ \__________________________________/ \ ` , \\_ /:/=[ Aka: un affaire de numero dassurence social nheeeeeeuuuuhhhh!]=\:\ \ \__\__________________________________________ ______________________________ \` \__\ /__/ \\_ /:/=[ Nexact ]=\:\ _// \__\________________________/__/ Une affaire de numéros d'assurance social ... L'algorithme Luhn(aussi appelle modulus 10 ou mod10) utiliser pour générer des numéros de carte qui est maintenant utilisée dans le domaine public a été developper en 1960 pour la validation de numéros unique par exemple, celle d'une carte de crédit, un numéro d'assurance social, numéro d'assurance, ect.. Bref, comme dans presque chaque numéro généré pour être utilisé dans le public se cache une algorithme voici celle utilisée pour savoir la validité d'un numéro : 046 454 286 < # d'assurance social 046 454 286 \/ multiplier le haut 121 212 121 /\ avec ces numéros. ----------- 086 858 276 0*1 = 0 4*2=8 2*1=2 4*2 = 8 5*1=5 8*2=16 <-- 6+1 = 7 6*1 = 6 4*2=8 6*1=6 Si la multiplication de a*b est un digit a 2 chiffres vous devez les additionner. ex: 8*2=16 <-- 6+1 = 7 <- ont utilisent ce chiffre. Maintenant ont additionne le résultat: 0+8+6+8+5+8+2+7+6=50 /\ Si le total est n/10 .. c'est un # valide. Sinon, c'est un faux #. L'analyse d'un numéro : Le premier chiffre ce trouve a être la province d'enregistration 1 = NB, NF, NS, PE 6 = AB, MB, SK, NT, NU? 2 = QC 7 = BC, YU 3 = mutant de quebec 8 = Not Used 4 = ON 9 = Immigrants & # temporaire. 5 = ON 0 = pas utilisé voilà la fonction pour éviter de pitonner :] int valid_number(char *number) { int i, n, sum = 0; char alternate = 0; for (i = strlen(number) - 1; i >= 0; i--) { n = number[i] - '0'; if (alternate) { n *= 2; if (n > 9) n = (n % 10) + 1; } sum += n; alternate = !alternate; } return (sum % 10 == 0); } Plusieurs personnes ont déjà collaboré pour essayer d'établir une database .. Mais bon celle-ci est incomplète ... le 2ieme et 3ieme chiffre semble être la date de naissance voici une petite table récupérer d’hackcanada: ___________________________________________________________________ |(AB) Alberta |(BC)British Columb. | (ON) Ontario | |------------------ | ------------------ | -------------------- | |623 1955-08-08 | 700 1935-08-11 | 404 1941-07 | |624 1957-08 | 703 1937-01-05 | 409 1943-07-30 | |624 1957-11 | 704 1941-08-31 | 423 1946-01-24 | |631 1966-05-31 | 706 1947-09-26 | 425 1946-06 | |637 1967 | 710 1968 | 443 1953-09 | |637 1968-10-08 | 720 1963-07-07 | 448 1955-04-01 | |639 1973-08-19 | 723 1966-07-28 | 448 1955-09-18 | |640 1968-01-29 | 725 1970 | 452 1956-07 | |640 1971-08-17 | 726 1972-12 | 457 1958-05-21 | |642 1972-09-24 | 726 1973-10-12 | 464 1960 | |642 1974-06-27 | 726 1973-11-19 | 465 1961-03-25 | |644 1975-01-06 | 726 1974-07-27 | 466 1959-01-27 | |644 1977-12-01 | 727 1974-12-31 | 467 1961-02-07 | |645 1976-09-16 | 728 1978-02-15 | 471 1960-11-14 | |645 1977-02-17 | 728 1978-02-15 | 475 1960-06-28 | |647 1978-08-17 | 729 1977-01-09 | 479 1973-07 | |648 1982-04-07 | 729 1977-05-12 | 482 1965-03-28 | |649 1983-01-08 | 729 1978-07-27 | 486 1970-02-20 | |650 1981-11-11 | 732 1980-03-05 | 486 1970-10-14 | |650 1983-01-14 | 733 1982-04-18 | 488 1971-07-21 | |650 1983-12-20 | 733 1982-05-12 | 490 1962-10-03 | |651 1981-10-29 | 734 1980-06-29 | 490 1971-01-23 | |651 1982-10-10 | 734 1982-10-02 | 490 1972-01-03 | |652 1982-04-24 | 734 1984-12-25 | 493 1972-10-12 | |653 1984-11-14 | 736 1983-11-01 | 495 1975-09-04 | |654 1984-01-26 | 736 1984-07-05 | 496 1972-09-03 | |654 1985-04-21 | 737 1984-09-20 | 496 1975-10-29 | |657 1986-03-27 | 739 1985-07-17 | 498 1974-11-21 | |659 1987-08-28 | | 498 1975-04-30 | | --------------------------------------- | 499 1976-09-20 | |(MB) Manitoba | (NB) New Brunswick | 500 1975-10 | | ------------------ | ------------------ | 503 1977-05-13 | |600 1941 | 106 1938 | 503 1979-09-20 | |608 1946-09-10 | 120 1965-12-14 | 505 1979-05 | |610 1938-12-13 | 121 1965-09-14 | 505 1979-10-01 | |614 1950-02 | 122 1970-03-14 | 505 1979-10-08 | |615 1943-01-06 | 123 1968-03-18 | 505 1980-07-23 | |621 1953-05-23 | 127 1981-12-17 | 505 1980-10-23 | |622 1954-02-22 | 129 1983-11-22 | 506 1980-09-01 | |623 1953-01-31 | 128 1985-01-10 | 511 1980-08-20 | |623 1953-07 | | 512 1982-03-07 | |623 1955-01-22 | (NF) Newfoundland | 513 1980-09-11 | |624 1957-11-22 | ------------------ | 514 1981-07-12 | |625 1957-05-20 | 112 1954 | 514 1983-04-11 | |628 1960-12-26 | 114 1960-07-23 | 515 1981-05-15 | |634 1957-07-14 | 126 1977-07-12 | 516 1980-08-09 | |635 1960-06-07 | 129 1987-04-21 | 516 1981-08-05 | |635 1964-02-01 | | 516 1982-09-30 | |636 1965-01-13 | (NS) Nova Scotia | 516 1983-09-15 | |637 1966-02-09 | ------------------ | 516 1983-10-08 | |640 1979-12-18 | 113 1965 | 518 1983-05-06 | |641 1971-10-25 | 119 1964-11-15 | 519 1981-10-16 | |642 1974-09-04 | 120 1964-08-11 | 520 1984-02-10 | |643 1974-06-13 | 122 1966-05-05 | 521 1984-11-29 | |644 1977-10-29 | 123 1971 | 522 1981-11-19 | |645 1978-10-01 | 124 1975-10-31 | 522 1985-12-05 | |646 1982-03-07 | 125 1978 | 523 1982-03-17 | |648 1978-03-15 | 127 1981-12-04 | 525 1982-11-28 | |648 1978-04-03 | 130 1985-05-12 | 525 1983-07-17 | |648 1978-09-28 | | 525 1985-05-09 | |649 1984-10-17 | (NT) NWT | 527 1983-02-24 | |650 1979-05-14 |--------------------| 528 1984-08-06 | |650 1979-07-29 | 643 1975-05-16 | 529 1985-02-13 | |652 1980-12-09 | 643 1975-08-30 | 529 1985-09-06 | |------------------- | ------------------ | 530 1984-07-24 | | (PE) PEI | (QC) Quebec | 532 1985-02-01 | | ------------------ | ------------------ | 536 1985-08 | | 121 1983-05-26 | 227 1949-09-20 | 540 1987-07-08 | | (SK) Saskatchewan | 232 1951-10-12 |------------------------ | ------------------ | 233 1951-08-05 | | 606 1946-02 | 246 1961-04-28 | | 632 1963 | 252 1963-10 | | 632 1969-10-11 | 259 1963 | | 639 1968-11-25 | 270 1973-05-29 | | 640 1969-12-04 | 271 1975-10-18 | | 640 1971-11 | 272 1974-06-02 | | 643 1973 | 273 1977-01-18 | | 647 1981-08-23 | 274 1978-08-11 | | 647 1983-11-24 | 276 1980-05 | | 650 1980-10-21 | 279 1980-05-31 | | 651 1982-11-24 | 279 1980-09-25 | | 654 1983-12-02 | 280 1981-10-30 | | 656 1983-02-06 | 284 1981-10-19 | | 658 1987-11-17 | 285 1984-05-25 | | | 286 1983-06-04 | | | 289 1984-10-30 | | | 291 1985-07-04 | | | 291 1986-07-27 | | | 291 1986-04-18 | | | 293 1987-07-05 | ------------------------------------------ Bref, ont peux coder un générateur asser facilement.. voici un petit bout de code qui pourrait être utile dans certains de vos projets en gros, ça génère un nick de 9 lettres pis la fonction pour vérifier s'il est valide #include #include #include #include #include #include using namespace std; int decryptnick(string nick); string rndnick(); int main() { string nickname; srand(time(0)); cout << "generation d'un nickname:" << endl; while(1) { nickname = rndnick(); cout << "checking:" << nickname; if (decryptnick(nickname) == 0) { cout << "<- VALIDE" << endl; break; } else { cout << "<- INVALIDE" << endl; } } return 0; } string rndnick() { char nick[10]; int i = 0,rnd; memset(nick, 0, sizeof(nick)); for (i=0;i<9;i++) { rnd = rand()*(4-1)/RAND_MAX+1; if (rnd == 1) { nick[i] = rand()*(58-49)/RAND_MAX+49; } if (rnd == 2) { nick[i] = rand()*(91-65)/RAND_MAX+65; } if (rnd == 3) { nick[i] = rand()*(100-97)/RAND_MAX+97; } if (i == 0) { nick[i] = rand()*(91-65)/RAND_MAX+65; } } nick[9] = '\0'; string nickname(nick); return nickname; } int decryptnick(string nick) { int total=0,calc=0,i=0; stringstream num; string no,realno; for (i = 0;i < 9;i++) num << (int)nick[i]; no = num.str(); for (i = 0;i < 18;i++) if ((i % 2) == 1) { realno += no[i]; } i = 0; for (i = 0;i < 9;i++) { calc = realno[i] - 48; if ((i % 2) == 1) { total += calc; } else { if ((calc * 2) >= 9) { total += (calc*2-9); } else { total += (calc*2); } } } if ((total % 10) == 0) { return 0; } else { return 1; } return -1; } Si jamais vous avez des projets interessant, aek ca, faite moi s'en part ;] Thx HackCanada :] __ .-----.-----.--.--.---.-.----.| |_ | | -__|_ _| _ | __|| _| |__|__|_____|__.__|___._|____||____| -nexact