verhoeff-algorithm
Version:
A TypeScript implementation of the Verhoeff algorithm.
48 lines (47 loc) • 1.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidVerhoeff = isValidVerhoeff;
const multiplicationTable = [
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
[2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
[3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
[4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
[5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
[6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
[7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
[8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
];
const permutationTable = [
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
[5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
[8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
[9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
[4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
[2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
[7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
];
/**
* Calculates the Verhoeff checksum for a given number array.
* @param numberArray An array of digits representing the number.
* @returns The checksum value.
*/
function calculateChecksum(numberArray) {
let c = 0;
const invertedArray = numberArray.slice().reverse();
invertedArray.forEach((val, i) => {
c = multiplicationTable[c][permutationTable[i % 8][val]];
});
return c;
}
/**
* Validates if the given number passes the Verhoeff check.
* @param number A string representing the number to check.
* @returns A boolean indicating if the number is valid.
*/
function isValidVerhoeff(number) {
const numberArray = number.split("").map(Number);
return calculateChecksum(numberArray) === 0;
}