Génération de chèques Luhn
Il y a beaucoup de mises en œuvre pour la validation de Luhn sommes mais très peu pour les générer. Je suis venu à travers cette une cependant, dans mes tests, il a révélé être buggy et je ne comprends pas la logique derrière le delta variable.
J'ai fait cette fonction qui est censé devrait généré Luhn sommes, mais pour une raison que je n'ai pas encore compris l'généré des sommes de contrôle invalide la moitié du temps.
function Luhn($number, $iterations = 1)
{
while ($iterations-- >= 1)
{
$stack = 0;
$parity = strlen($number) % 2;
$number = str_split($number, 1);
foreach ($number as $key => $value)
{
if ($key % 2 == $parity)
{
$value *= 2;
if ($value > 9)
{
$value -= 9;
}
}
$stack += $value;
}
$stack = 10 - $stack % 10;
if ($stack == 10)
{
$stack = 0;
}
$number[] = $stack;
}
return implode('', $number);
}
Quelques exemples:
Luhn(3); //37, invalid
Luhn(37); //372, valid
Luhn(372); //3728, invalid
Luhn(3728); //37283, valid
Luhn(37283); //372837, invalid
Luhn(372837); //3728375, valid
Je suis la validation de l'généré sommes à l'encontre de cette pagece que je fais mal?
Référence pour l'avenir, ici, c'est le travail de la fonction.
function Luhn($number, $iterations = 1)
{
while ($iterations-- >= 1)
{
$stack = 0;
$number = str_split(strrev($number), 1);
foreach ($number as $key => $value)
{
if ($key % 2 == 0)
{
$value = array_sum(str_split($value * 2, 1));
}
$stack += $value;
}
$stack %= 10;
if ($stack != 0)
{
$stack -= 10;
}
$number = implode('', array_reverse($number)) . abs($stack);
}
return $number;
}
J'ai laissé tomber l' $parité variable puisque nous n'avons pas besoin à cette fin, et pour vérifier:
function Luhn_Verify($number, $iterations = 1)
{
$result = substr($number, 0, - $iterations);
if (Luhn($result, $iterations) == $number)
{
return $result;
}
return false;
}
source d'informationauteur Alix Axel
Vous devez vous connecter pour publier un commentaire.
Modifier: Désolé, je me rends compte maintenant que vous avez eu presque la totalité de ma réponse déjà, tu avais juste mal déterminé le facteur à utiliser pour qui les chiffres.
Toute ma réponse maintenant, peut se résumer par cette simple phrase:
Vous avez le facteur inversée, vous êtes en multipliant les mauvais chiffres par 2 en fonction de la longueur de la nombre.
Prendre un coup d'oeil à la Article de wikipédia sur l'algorithme de Luhn.
La raison de votre somme de contrôle n'est pas valide, la moitié du temps, c'est qu'avec vos chèques, la moitié du temps de votre numéro un nombre impair de chiffres, et puis vous double le mauvais chiffres.
Pour 37283, lors du comptage de la droite, vous obtenez cette séquence de nombres:
L'algorithme nécessite de faire la somme des chiffres individuels à partir du nombre d'origine, et les chiffres individuels du produit de ceux "toutes les deux chiffres à partir de la droite".
Donc, à partir de la droite, vous somme 3 + (1 + 6) + 2 + (1 + 4) + 3, qui vous donne 20.
Si le numéro que vous finissent par se termine par un zéro, ce qui 20 est le cas, le numéro est valide.
Maintenant, votre question fait allusion à vous désireux de savoir comment générer de la somme de contrôle, eh bien, c'est facile, procédez de la manière suivante:
Exemple: le Numéro est 12345
Calculer la luhn de la somme de contrôle pour 123450, qui résultats dans
Prendre la somme (15), le module 10, qui vous donne 5
De sorte que le résultat est 123455.
votre php est buggé, il mène dans une boucle infinie.
C'est la version que j'utilise, modifié à partir de votre code
Créer un php et exécuter dans votre localhost Luhn(xxxxxxxx) pour confirmer.
MAUVAIS
J'ai littéralement ne peut pas croire combien de minable implémentations il y a des.
MAUVAIS
Ce gâchis d'une page qui est fait actuellement à partir de Wikipedia(!) pour Javascript a plusieurs tests de vérification des implémentations qui ne sont même pas retourner la même valeur quand je l'appelle chacun.
BON
La la page des liens à partir de Wikipédia en Luhn page a un codeur Javascript qui semble fonctionner :
BON
Ce très utile EE4253 page vérifie le caractère de contrôle, et montre également le calcul complet, et l'explication.
BON
J'ai besoin de code C# et s'est terminée à l'aide de ce projet de code de code:
BON
Ce la validation de code en C# semble fonctionner, même si un peu lourd. J'ai simplement utilisé pour vérifier les ci-dessus est correcte.
Il y a maintenant un dépôt github basé sur l'original de question/réponse. Voir
https://github.com/xi-project/xi-algorithm
Il est également disponible sur packagist
C'est une fonction qui peut vous aider, elle est courte et il fonctionne très bien.