Une fonction qui trouve toutes les combinaisons de n caractères dans un charset donné.
Une version récursive (plus jolie) et une version linéaire. Je ne sais pas laquelle est la plus performante, mais de toute manière si vous recherchez la performance autant traduire ce code dans un autre langage.
Source / Exemple :
<?
function map($lettre)
echo chr($lettre);
$charset = range(97,122);
$num = count($charset);
$last = $num-1;
$length = 5;
$mot = array();
while($mot[$length - 1] <= $last)
{
for($i = 0; $i < $num; ++$i)
{
$mot[0] = $i;
array_walk($mot, 'map');
echo "\n";
}
$j = 0;
while($mot[$j] == $last)
{
$mot[$j] = 0;
++$j;
}
if($j == $length)
break;
$mot[$j]++;
}
?>
En récursif :
<?php
$charset = range(97, 122);
function recurse($width, $position, $base)
{
global $charset;
foreach($charset as $char)
{
if ($position < $width - 1)
recurse($width, $position + 1, $base.chr($char));
echo $base.chr($char)."\n";
// ici on fait ce que l'on veut du mot là je l'affiche.
}
}
$maxChars = 3;
for($width = 1; $width < $maxChars+1; ++$width)
recurse($width, 0, "");
?>
27 août 2010 à 11:15
27 août 2010 à 11:14
je donne un exemple du resultat de la version recursive avec : $maxChars = 5;
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
aa
ab
ac
ad
ae
af
ag
ah
ai
aj
ak
al
am
an
ao
ap
aq
ar
as
at
au
av
aw
ax
ay
az
a
aaa
aab
aac
aad
aae
aaf
aag
aah
aai
aaj
aak
aal
aam
aan
aao
aap
aaq
aar
aas
aat
aau
aav
aaw
aax
aay
aaz
aa
a
Comme vous pouvez voir seulment le dernier charactère de chaque bloc est modifié et le résultat "aa" est double.
ce code est donc pas valable. une solution au problèmme ?
(mon seul objectif c'est de tester la sécurité de mes propres sites web.)
30 nov. 2009 à 23:28
dans l'attente d'une réponse clair
merci
24 août 2009 à 14:25
En testant la fonction récursive, j'aperçois des doublons parasites, serait-ce possible de les éliminer autrement que par des tests conditionnels (ce que j'ai fait) ? Merci d'avance !
PS j'ai mis 10 ;-)
5 mai 2009 à 20:28
Simple. Accessible.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.