Skip to content

Implementation of the 11-proof, a mathematical test used by the Dutch government for various digital identification numbers

License

Notifications You must be signed in to change notification settings

MrLuit/elfproef

Repository files navigation

Elfproef (11-proof)

Travis CI Version Dependencies License


Implementation of the 11-proof, a mathematical test used by the Dutch government for various digital identification numbers


Description

Explanation

Elfproef is Dutch for 11-proof (elf means 11, proef means test). It was originally designed to prevent people from trying to transfer money to a mistyped account number, specifically where either one digit is incorrect, or 2 digits were swapped.

The principle is very simple. First of all, a given number is split into its individual digits. Secondly, those digits are multiplied by their "weight", a multiplier which is based on the position of the digit. Finally, the sum of all multiplied numbers is calculated.

If the result is divisible by 11 and greater than 0, the 11-proof is valid.

Example

A Dutch social security number (BSN) consists of 9 digits and must suffice the 11-proof with weights [9, 8, 7, 6, 5, 4, 3, 2, -1]. Sometimes the BSN can also consist of 8 digits, which is usually converted to 9 digits by adding a leading zero.

For a given BSN ABCDEFGHI, the outcome of the following formula must be divisble by 11 and have no more than one leading zero.

(9 × A) + (8 × B) + (7 × C) + (6 × D) + (5 × E) + (4 × F) + (3 × G) + (2 × H) + (-1 × I)

A valid BSN would be 111222333.

(9 × 1) + (8 × 1) + (7 × 1) + (6 × 2) + (5 × 2) + (4 × 2) + (3 × 3) + (2 × 3) + (-1 × 3) = 66

The result is divisible by 11:

66 > 0 66 ∧ 66 mod 11 = 0

Usage

Installation

yarn add elfproef -E

Example

import { validateBSN } from 'elfproef';

const BSN = "111222333";
const validBSN = validateBSN(BSN);

console.log(validBSN);

Functions

elfProef(input: string | number, weights: number[], positiveSum: boolean): boolean

The first argument is the input string or number which will be tested. The second argument is an array containing the weights which will be used to multiply each digit, which means the length of this array should be equal to the input length. The third argument adds an additional check for making sure the resulting sum is greater than zero, which is not used for the BSN, but was needed for checking dutch banking numbers before the IBAN system was implemented. This functions returns a boolean indicating whether the check was successful.

validateBSN(input: string | number): boolean

This function will validate a BSN as shown in the example above. The input can be either a string or a number, and the return value will be a boolean indicating whether the provided input is a valid BSN.

generateBSN(): string

This function generates a random valid BSN and returns it as a string.

References

License

This project is licensed under the MIT License.

About

Implementation of the 11-proof, a mathematical test used by the Dutch government for various digital identification numbers

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published