Table of Contents

Damm Class

Definition

Namespace
Bodu.IO.Hashing.CheckDigits
Assembly
Bodu.IO.Hashing.dll
Package
Bodu.IO.Hashing 1.0.0
Source
Damm.Table.cs

Computes the check digit of a decimal string using the Damm algorithm. This class cannot be inherited.

public sealed class Damm : CheckDigitAlgorithm
Inheritance
Damm
Inherited Members
Extension Methods

Examples

// Single-call computation against an in-memory body.
char check = Damm.Compute("572");   // '4'

// Full-sequence validation - equivalent to checking that the final interim is zero.
bool ok = Damm.IsValid("5724");     // true

// Streaming use when the body is built up incrementally.
var algo = new Damm();
algo.Append("572");
char d = algo.GetCurrentCheckDigit(); // '4'

Remarks

The Damm algorithm was presented by H. Michael Damm in 2004. It evaluates a running interim digit by repeatedly indexing into a carefully chosen 10×10 totally antisymmetric quasigroup - a table with no fixed points on its diagonal and no partial idempotent entries. The final interim is the check digit.

Damm detects all single-digit substitution errors and all adjacent-digit transpositions - the latter without the 09 ↔ 90 exception that Luhn suffers from. Validation is especially clean: a sequence (body followed by its check digit) is valid if and only if its final interim is zero.

Worked example. For the body "572", the computed check digit is '4', and the resulting sequence "5724" is therefore valid under Damm.

important

This algorithm is not cryptographically secure and should not be used for password hashing, digital signatures, or integrity validation in security-sensitive applications.

Constructors

Damm()

Initializes a new instance of the Damm class.

public Damm()

Properties

AlgorithmName

Gets the canonical name of the algorithm, suitable for diagnostic output and logging.

public override string AlgorithmName { get; }

Property Value

string

A short, stable identifier such as "Luhn", "IBAN", or "ISO 7064 MOD 97-10".

Methods

Append(ReadOnlySpan<char>)

Absorbs the supplied characters into the running check-value state.

public override void Append(ReadOnlySpan<char> body)

Parameters

body ReadOnlySpan<char>

The characters to append. Each element must belong to the algorithm's accepted input alphabet. An empty span is a permitted no-op.

Exceptions

ArgumentOutOfRangeException

Thrown when body contains any character outside the algorithm's accepted input alphabet.

Compute(ReadOnlySpan<char>)

Computes the Damm check digit for the supplied body of decimal digits without allocating a streaming instance.

public static char Compute(ReadOnlySpan<char> body)

Parameters

body ReadOnlySpan<char>

The body characters. Each must be an ASCII decimal digit ('0' to '9').

Returns

char

The check digit as an ASCII character in the range '0' to '9'.

Exceptions

ArgumentOutOfRangeException

Thrown when body contains any character outside the range '0' to '9'.

GetCurrentCheckDigit()

Returns the check digit computed for the body absorbed since the last Reset() (or since construction).

public override char GetCurrentCheckDigit()

Returns

char

The check digit as an ASCII character in the range '0' to '9'. For an empty body all built-in algorithms return '0'.

Remarks

This call is non-destructive; the running state is unaffected and the method may be invoked any number of times with identical results between appends.

IsValid(ReadOnlySpan<char>)

Determines whether the supplied sequence, comprising a body followed by a trailing Damm check digit, is valid - that is, whether the final interim evaluates to zero.

public static bool IsValid(ReadOnlySpan<char> digitsIncludingCheck)

Parameters

digitsIncludingCheck ReadOnlySpan<char>

The complete sequence including the trailing check digit.

Returns

bool

true if the sequence evaluates as valid under Damm; otherwise, false - including the case where digitsIncludingCheck is empty or contains a character outside the range '0' to '9'.

Reset()

Resets the algorithm to its initial state, discarding any characters previously absorbed.

public override void Reset()

Remarks

Equivalent in behavior to constructing a fresh instance of the same concrete type.

Applies to

ProductVersions
.NET8, 10