Générer tous les mots de passe possibles à N caractères dans Go
En Python, on peut utiliser la fonction itertools.product() pour générer tous les mots de passe possibles. mots de passe d'une longueur fixe. Par exemple, pour créer des mots de passe à 2 caractères en utilisant les caractères A-E, on pourrait utiliser :
from itertools import product for permutation in product('ABCDE', repeat=2): print(permutation)
Cependant, dans Go, la tâche de génération de mots de passe peut être réalisée par une approche différente :
L’opération souhaitée est essentiellement un produit cartésien n-aire d’un ensemble avec lui-même. Par exemple, pour créer tous les mots de passe à 3 caractères, nous avons besoin de Prod(set,set,set). Cela peut être construit de manière itérative.
Dans un premier temps, nous créons notre produit n-1, puis pour chaque produit et chaque élément de l'ensemble d'origine, nous ajoutons cet élément. Montrons avec une génération de mot de passe de 2 à 3 caractères :
"ab" = {a,b} -> {(a,a),(a,b),(b,a),(b,b)} -> {(une,une,une),(une,une,b),(une,b,une),(une,b,b),(b,une,une),(b,une,b),( b,b,a),(b,b,b)}
Dans Go, nous pouvons implémenter cela comme :
func NAryProduct(input string, n int) []string { if n <= 0 { return nil } prod := make([]string, len(input)) for i, char := range input { prod[i] = string(char) } for i := 1; i < n; i++ { next := make([]string, 0, len(input)*len(prod)) for _, word := range prod { for _, char := range input { next = append(next, word+string(char)) } } prod = next } return prod }
Cette solution peut être encore optimisée en tirant parti de l'évaluation paresseuse, réduisant l'utilisation de la mémoire. Voici un lien vers un terrain de jeu pour référence : http://play.golang.org/p/6LhApeJ1bv
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!