Verhoeff Algorithm

The Verhoeff algorithm is a checksum formula for error detection developed by the Dutch mathematician Jacobus Verhoeff and was first published in 1969. It was the first decimal check digit algorithm which detects all single-digit errors, and all transposition errors involving two adjacent digits, which was at the time thought impossible with such a code.



									$_multiplicationTable = array(
	array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
	array(1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
	array(2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
	array(3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
	array(4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
	array(5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
	array(6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
	array(7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
	array(8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
	array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
);

$_permutationTable = array(
	array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
	array(1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
	array(5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
	array(8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
	array(9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
	array(4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
	array(2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
	array(7, 0, 4, 6, 9, 1, 3, 2, 5, 8)
);

$_inverseTable = array(0, 4, 3, 2, 1, 5, 6, 7, 8, 9);

function CheckSum($number)
{
	global $_multiplicationTable, $_permutationTable, $_inverseTable;
	$c = 0;
	$len = strlen($number);

	for ($i = 0; $i < $len; ++$i)
		$c = $_multiplicationTable[$c][$_permutationTable[(($i + 1) % 8)][$number[$len - $i - 1] - '0']];

	return $_inverseTable[$c];
}

function Validate($number)
{
	global $_multiplicationTable, $_permutationTable;
	$c = 0;
	$len = strlen($number);

	for ($i = 0; $i < $len; ++$i)
		$c = $_multiplicationTable[$c][$_permutationTable[($i % 8)][$number[$len - $i - 1] - '0']];

	return $c == 0;
}
								


Example

									$c = CheckSum("58564");
$isValid = Validate("585649");
								


Output

									c: 9
isValid: true