UNPKG

verhoeff-algorithm

Version:

A TypeScript implementation of the Verhoeff algorithm.

50 lines (44 loc) 1.51 kB
const multiplicationTable: number[][] = [ [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: number[][] = [ [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: number[]): number { 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. */ export function isValidVerhoeff(number: string): boolean { const numberArray: number[] = number.split("").map(Number); return calculateChecksum(numberArray) === 0; }