A lightweight, flexible C# library for generating unique reference numbers in various formats. Perfect for creating order numbers, transaction IDs, document references, payment references, and more.
- ✅ Multiple formats: Numeric, alphabetic, alphanumeric, and GUID generation
- ✅ Check digit support: Luhn, Mod97 (IBAN), Verhoeff, and Damm algorithms
- ✅ Template-based generation: Powerful template syntax for custom formats
- ✅ Human-friendly mode: Excludes ambiguous characters (0/O, 1/I/l)
- ✅ Cryptographically secure: Option for security-critical applications
- ✅ Sequence support: Auto-incrementing references with padding
- ✅ Cross-platform: Supports .NET Standard 2.0, .NET 6.0, and .NET 8.0
- ✅ DI-friendly: Includes interface for dependency injection
- ✅ Zero dependencies: No external runtime dependencies
dotnet add package ReferenceGeneratorOr via Package Manager Console:
Install-Package ReferenceGeneratorusing ReferenceGenerator;
// Generate a 10-digit numeric reference
string numericRef = ReferenceNumberGenerator.GenerateNumeric(10);
// Example: "1234567890"
// Generate with prefix
string orderRef = ReferenceNumberGenerator.GenerateNumeric(6, "ORD-");
// Example: "ORD-123456"
// Generate alphanumeric
string alphanumericRef = ReferenceNumberGenerator.GenerateAlphanumeric(12);
// Example: "A1B2C3D4E5F6"
// Generate cryptographically secure reference
string secureRef = ReferenceNumberGenerator.GenerateSecure(16);
// Example: "X7Y9Z2W4P5Q8R1S3"Generate references with built-in check digit validation - perfect for payment references, invoice numbers, and any system requiring error detection.
| Algorithm | Use Case | Check Digits |
|---|---|---|
| Luhn (Mod 10) | Credit cards, IMEI numbers | 1 digit |
| Mod 97 | IBAN validation (ISO 7064) | 2 digits |
| Verhoeff | High-security applications | 1 digit |
| Damm | Error detection | 1 digit |
using ReferenceGenerator;
using ReferenceGenerator.CheckDigit;
// Generate with Luhn check digit
string paymentRef = ReferenceNumberGenerator.GenerateNumericWithCheckDigit(9, CheckDigitAlgorithm.Luhn);
// Example: "1234567893" (where 3 is the check digit)
// Validate a reference
bool isValid = ReferenceNumberGenerator.ValidateLuhn("1234567893"); // true
// Generate with different algorithms
string verhoeffRef = ReferenceNumberGenerator.GenerateNumericWithCheckDigit(8, CheckDigitAlgorithm.Verhoeff);
string dammRef = ReferenceNumberGenerator.GenerateNumericWithCheckDigit(8, CheckDigitAlgorithm.Damm);
// Direct check digit calculation
char checkDigit = CheckDigitCalculator.CalculateLuhn("123456789"); // '7'
string mod97Digits = CheckDigitCalculator.CalculateMod97("ABCD1234"); // "XX"Create complex reference formats using a powerful template syntax.
| Placeholder | Description | Example |
|---|---|---|
{NUMERIC:n} |
n random digits | {NUMERIC:6} → "482917" |
{ALPHA:n} |
n uppercase letters | {ALPHA:4} → "XKWM" |
{ALPHANUMERIC:n} |
n letters/digits | {ALPHANUMERIC:8} → "A3B7K2M9" |
{DATE:format} |
Formatted date/time | {DATE:yyyyMMdd} → "20250123" |
{GUID} |
Standard GUID | {GUID} → "550e8400-e29b-..." |
{GUID:N} |
GUID without dashes | {GUID:N} → "550e8400e29b..." |
{SEQ:n} |
Padded sequence | {SEQ:5} → "00001" |
{VAR:name} |
Custom variable | {VAR:region} → (your value) |
{CHECK:algo} |
Check digit | {CHECK:Luhn} → "3" |
{SECURE:n} |
Crypto-secure random | {SECURE:10} → "X7Y9Z2W4P5" |
using ReferenceGenerator;
using ReferenceGenerator.Templates;
// Simple template
string orderRef = ReferenceNumberGenerator.FromTemplate(
"ORD-{DATE:yyyyMMdd}-{NUMERIC:4}");
// Example: "ORD-20250123-4829"
// With variables
string invoiceRef = ReferenceNumberGenerator.FromTemplate(
"{VAR:prefix}-{DATE:yyMM}-{NUMERIC:6}",
new { prefix = "INV" });
// Example: "INV-2501-482917"
// With check digit
string paymentRef = ReferenceNumberGenerator.FromTemplate(
"PAY{NUMERIC:9}{CHECK:Luhn}");
// Example: "PAY1234567893" (Luhn-validated)
// With sequence numbers (reusable template)
var template = ReferenceNumberGenerator.CreateTemplate("TXN-{SEQ:6}", startSequence: 1000);
template.Generate(); // "TXN-001000"
template.Generate(); // "TXN-001001"
template.Generate(); // "TXN-001002"
// Complex multi-part reference
string complexRef = ReferenceNumberGenerator.FromTemplate(
"{VAR:country}{DATE:yyMMdd}{ALPHA:2}{NUMERIC:4}{CHECK:Damm}",
new { country = "NG" });
// Example: "NG250123XK48293"var template = new ReferenceTemplate("{ALPHANUMERIC:12}");
string[] batchRefs = template.GenerateMany(100);
// Generates 100 unique referencesGenerate references that avoid ambiguous characters (0/O, 1/I/l) for better readability when users need to type or read references.
// Excludes 0, O, 1, I, l
string friendlyRef = ReferenceNumberGenerator.GenerateHumanFriendly(8);
// Example: "X7K2M9P4" (never contains ambiguous characters)The library includes an IReferenceGenerator interface for easy DI integration:
// Register in DI container
services.AddSingleton<IReferenceGenerator, ReferenceNumberGenerator>();
// Inject and use
public class OrderService
{
private readonly IReferenceGenerator _refGen;
public OrderService(IReferenceGenerator refGen)
{
_refGen = refGen;
}
public string CreateOrder()
{
return _refGen.GenerateNumericWithCheckDigit(9, CheckDigitAlgorithm.Luhn, "ORD-");
}
}// Basic generation
ReferenceNumberGenerator.GenerateNumeric(int length, string? prefix = null)
ReferenceNumberGenerator.GenerateAlphabetic(int length, string? prefix = null)
ReferenceNumberGenerator.GenerateAlphanumeric(int length, string? prefix = null)
ReferenceNumberGenerator.GenerateGuid(string? prefix = null)
ReferenceNumberGenerator.GenerateSecure(int length, string? prefix = null)
ReferenceNumberGenerator.GenerateHumanFriendly(int length, string? prefix = null)
// With check digit
ReferenceNumberGenerator.GenerateNumericWithCheckDigit(int length, CheckDigitAlgorithm algo, string? prefix = null)
// Validation
ReferenceNumberGenerator.ValidateLuhn(string reference)
ReferenceNumberGenerator.ValidateMod97(string reference)
ReferenceNumberGenerator.ValidateVerhoeff(string reference)
ReferenceNumberGenerator.ValidateDamm(string reference)
ReferenceNumberGenerator.Validate(string reference, CheckDigitAlgorithm algorithm)
// Template-based
ReferenceNumberGenerator.FromTemplate(string template, object? variables = null)
ReferenceNumberGenerator.CreateTemplate(string template, long startSequence = 1)// Calculate check digits
CheckDigitCalculator.CalculateLuhn(string number) // Returns char
CheckDigitCalculator.CalculateMod97(string reference) // Returns string (2 chars)
CheckDigitCalculator.CalculateVerhoeff(string number) // Returns char
CheckDigitCalculator.CalculateDamm(string number) // Returns char
// Generic methods
CheckDigitCalculator.Calculate(string input, CheckDigitAlgorithm algorithm)
CheckDigitCalculator.Validate(string input, CheckDigitAlgorithm algorithm)
CheckDigitCalculator.AppendCheckDigit(string input, CheckDigitAlgorithm algorithm)- E-commerce: Order numbers, invoice references
- Fintech: Payment references, transaction IDs
- Healthcare: Patient IDs, prescription numbers
- Logistics: Tracking numbers, shipment references
- Government: Document numbers, application IDs
- Any system requiring unique, validated identifiers
Contributions are welcome! Please read our contributing guidelines before submitting pull requests.
- Clone the repository
- Open
ReferenceGenerator.slnin Visual Studio or your preferred IDE - Run tests:
dotnet test
dotnet testThis project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any issues or have questions:
- Check existing issues
- Create a new issue if your problem hasn't been reported
- Provide as much detail as possible when reporting issues
Okwuchi Uzoigwe - GitHub