Desenvolvi esse código para gerar da forma mais rápida possível as combinações, sendo esse o resultado final do que obtive de mais rápido.
Você só precisa mudar as as 3 primeiras linhas do código onde se encontram: o tamanho da combinação; os caracteres usados; e o arquivo onde irá salvar.
Vale lembrar que do modo que se encontra o código ele vai gerar 78.074.896 combinações que no meu PC demorou 53,7976429462433 segundos (Usei o Time::HiRes para marcar o tempo). Mas já cheguei a gerar 1bilhão em 600 segundos. Estou usando versao 32 bits do perl no windows com computador i7 2.8ghz para quem quiser usar como comparação.
Faça o uso que desejar. Abraços!
Você só precisa mudar as as 3 primeiras linhas do código onde se encontram: o tamanho da combinação; os caracteres usados; e o arquivo onde irá salvar.
Vale lembrar que do modo que se encontra o código ele vai gerar 78.074.896 combinações que no meu PC demorou 53,7976429462433 segundos (Usei o Time::HiRes para marcar o tempo). Mas já cheguei a gerar 1bilhão em 600 segundos. Estou usando versao 32 bits do perl no windows com computador i7 2.8ghz para quem quiser usar como comparação.
Faça o uso que desejar. Abraços!
Código:
#!/usr/bin/perl my $q = 4; #Tamanho da combinação, mas cuidado, quanto maior for mais tempo irá demorar para gerar... my @chars = ((0..9),(a..z),(A..Z),qw(! @ # $ % ^ & * - _ + = ; : " ' < > , . ? / \ | ` ~ ( ) { } [ ])); #Caracteres usados para gerar a combinação, você pode retirar ou acrescentar caracteres, desde que inseridos como arrays. my $file = 'combinacoes.txt'; #arquivo onde você deseja salvar as combinações my $ncs = $#chars; my $totalcom = scalar(@chars)**$q; print "Caracteres usados: @chars\n\nTotal de caracteres:".scalar(@chars)."\n\nTamanho da combinacao: $q\n\nTotal de combincacoes: $totalcom\n\nPara interromper use Ctrl+C\n"; open $fh,'>',$file or die "Falha ao abrir para escrever no arquivo $file!"; my $inc = 0; my $i = $q -1; for my $x (0..$i) { $c[$x] = ($x == $i) ? -1:0; $n[$x] = $chars[$c[$x]]; } my @a = reverse(0..$i); inicio: $inc++; for my $x (@a) { if ($c[$x] < $ncs) { $c[$x]++; $n[$x] = $chars[$c[$x]]; last; } $c[$x] = 0; $n[$x] = $chars[$c[$x]]; } print $fh join("",@n)."\n"; goto inicio if ($inc < $totalcom); close $fh; print "\nFIM!"; exit 0;