La mise en œuvre de l'algorithme de Luhn
Je suis en train de mettre en œuvre une simple validation des numéros de carte de crédit. J'ai lu à propos de l'algorithme de Luhn sur Wikipédia:
- En comptant à partir du chiffre de contrôle, qui est le plus à droite, et le déplacement
à gauche, le double de la valeur de chaque deuxième chiffre.- Calcule la somme des chiffres de produits (p. ex., 10: 1 + 0 = 1, 14: 1 + 4 = 5)
en collaboration avec le undoubled chiffres du nombre.- Si le total modulo 10 est égal à 0 (si le total se termine par un zéro)
le nombre est valide selon la formule Luhn; d'autre c'est
pas valide.
Sur Wikipédia, la description de l'algorithme de Luhn est très facile à comprendre. Cependant, j'ai également vu d'autres implémentations de l'algorithme de Luhn sur Rosetta Code et d'ailleurs.
Ces implémentations fonctionnent très bien, mais je suis confus au sujet de pourquoi ils peuvent utiliser un tableau pour faire le travail. Le tableau qu'ils utilisent semble n'avoir aucun rapport avec l'algorithme de Luhn, et je ne vois pas comment ils réussissent à la procédure décrite sur Wikipédia.
Pourquoi sont-ils à l'aide de tableaux? Quelle est la signification d'entre eux, et comment sont-ils utilisés pour mettre en œuvre l'algorithme tel que décrit par Wikipédia?
- Votre question est un peu floue. Pouvez-vous expliquer ce que vous êtes en demandant de nouveau?
- J'ai mis à jour la question.
- La meilleure Solution ici plnkr.co/modifier/34aR8NUpaKRCYpgnfUbK?p=preview avec tous les cas de test adoptée conformément à l' paypalobjects.com/en_US/vhelp/paypalmanager_help/...
Vous devez vous connecter pour publier un commentaire.
le tableau
[0,1,2,3,4,-4,-3,-2,-1,0]
est utilisé comme une matrice pour trouver la différence entre un nombre de 0 à 9 et les chiffres de la somme de 2 fois sa valeur. Par exemple, pour le numéro 8, la différence entre le 8 et (2*8) = 16 -> 1+6 = 7 est de 7-8 = -1.Voici la présentation graphique, où {n} stand pour la somme des chiffres de n
L'algorithme que vous avez énuméré quelques-somme de tous les chiffres et pour chaque même endroit chiffres, de rechercher le la différence à l'aide de la matrice, et de l'appliquer à la somme totale.
Malheureusement, aucun des codes ci-dessus a fonctionné pour moi. Mais j'ai trouvé sur GitHub une solution de travail
if (!value) return false;
en haut, sinon, elle retourne la valeur true pour une chaîne vide ou0
Compact Luhn validator:
Fonctionne bien pour les deux CC et le numéro d'IMEI. Violon: http://jsfiddle.net/8VqpN/
return /^\d+$/.test( imei ) && ( imei.split( '' ).reverse().reduce( function( sum, d, n ){ return +sum + ( ( n%2 ) ? [ 0,2,4,6,8,1,3,5,7,9 ][ +d ] : +d ); }, 0) ) % 10 == 0;
(supprimé vieux commentaire juste au cas où)Tables de recherche ou les tableaux peuvent simplifier des implémentations d'algorithmes - enregistrer le nombre de lignes de code et avec cette augmentation de la performance... si le calcul de l'index de recherche est simple - ou plus simple - et le tableau de la mémoire est abordable.
D'autre part, de comprendre comment le particulier recherche tableau ou une structure de données est venu à être peut parfois être très difficile, puisque le liés à l'implémentation de l'algorithme peut paraître à première vue, assez différente de l'original de l'algorithme de spécification ou une description.
Indication à utiliser les tables de recherche nombre orienté algorithmes avec un simple calcul, des comparaisons simples, et aussi structuré répétition de motifs - et bien sûr de tout à fait finis les ensembles de valeurs.
Le nombre de réponses dans ce thread aller à différentes tables de recherche et que pour les différents algorithmes à mettre en œuvre le même algorithme de Luhn. La plupart des implémentations utilisez la recherche tableau d'éviter la lourdeur de trouver de la valeur pour le doublé chiffres:
Une égalité de mise en œuvre pour l'obtention de la luhnFinalValue ressemble à ceci:
Qui - avec les commentaires ci-dessus le vrai et le faux des termes est bien sûr simplifié:
Maintenant, je ne suis pas sûr si j'ai "sauvé" rien du tout... 😉 surtout grâce à la valeur formée ou la forme abrégée de si-alors-sinon. Sans elle, le code peut ressembler à ceci - avec 'ordonnée' blocs
et incorporée dans la prochaine contexte supérieurs de la couche de l'algorithme et donc luhnValue:
Ou:
Btw, moderne, optimisation des interprètes et (juste à temps) des compilateurs, la différence n'est que dans le code source et les questions uniquement pour des raisons de lisibilité.
Venus de loin avec explication - et la "justification" de l'utilisation de tables de recherche et de comparaison à droite, avant le codage, la table de recherche semble maintenant un peu exagéré pour moi. L'algorithme sans est maintenant très facile de finition, et il a l'air assez compact trop:
Ce qui me frappe, après être passé par l'explication de l'exercice est que, à l'origine, les plus alléchantes de la mise en œuvre - une aide à réduire() à partir de @kalypto - vient de perdre totalement son lustre pour moi... pas seulement parce qu'il est défectueux à plusieurs niveaux, mais plus encore parce qu'il montre que les cloches et de sifflets ne peut pas toujours "l'anneau de la victoire bell'. Mais merci à vous, @kalypto, il m'a fait réellement utiliser - et de comprendre - réduire():
D'être fidèle à ce fil, un peu plus de recherche options de la table doivent être mentionnés:
Le code pour le dernier - à l'aide de réduire - peut ressembler à ceci:
Et de fermeture de lunValid4() - très compact - et en utilisant simplement 'à l'ancienne' (compatible) JavaScript - avec une seule table de recherche:
Corollar: Chaînes peut être regardé comme des tables de caractères... 😉
Un parfait exemple d'une belle table de recherche de l'application est le comptage de bits bits listes de bits dans un (très) long octet de 8 bits chaîne (interprété) langage de haut niveau (où toutes les opérations sur les bits sont assez cher). La table de recherche a 256 entrées. Chaque entrée contient le nombre de bits dans un entier non signé de 8 bits de l'entier égal à l'indice de l'entrée. Une itération à travers la chaîne et la prise de la non signé de 8 bits de l'octet de valeur égale, l'accès le nombre de bits de cet octet de la table de recherche. Même pour le langage de bas niveau - comme assembleur /code machine - la table de recherche est la voie à suivre... surtout dans un environnement où le microcode (instruction) peut gérer plusieurs octets jusqu'à 256 ou plus dans un (unique CDCI) de l'instruction.
Quelques remarques:
il s'agit d'opérations arithmétiques à court formulaire, la valeur-si-alors-sinon expressions comme des termes.
continuation sur la même ligne que la continuation, et j' "fermer" les choses de la moitié d'un onglet en retrait de l'ouverture de l'élément.
algorithme discbased luhn lookuptable carte validation bitlist
Un très rapide et élégant de la mise en œuvre de la algorithme de Luhn suivantes:
JS:
Sur mon git référentiel vous pouvez saisir et récupérer plus d'informations (comme des repères lien et plein de tests unitaires pour ~50 navigateurs et certains node.js les versions).
Ou vous pouvez simplement l'installer via bower ou mnp. Il fonctionne à la fois sur les navigateurs et/ou le nœud.
Si vous voulez calculer la somme de contrôle, ce code à partir de cette page est très concis et dans mes essais aléatoires semble fonctionner.
REMARQUE: la vérification algorithmns sur cette page n'ont PAS tout le travail.
Voici mon résultats pour C#
Mise à jour: Voici une version plus petite w/o constantes de chaîne:
Code est le suivant:
La variable
counter
est la somme de tous les chiffres en position impaire, plus du double des chiffres dans les même positions, quand le double de plus de 10 nous ajouter les deux chiffres qui en font (ex: 6 * 2 -> 12 -> 1 + 2 = 3)Le Tableau que vous me demandez est le résultat de tous les doubles possibles
var luhnArr = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];
Ainsi, par exemple
Une autre alternative:
Alternative 😉 Simple et le Meilleur
Meilleure Solution ici
de tous les tests passés selon
et le crédit va à
J'ai travaillé sur la solution suivante après avoir soumis une bien pire pour un test..