package main
import (
"crypto/rand"
"fmt"
"math/big"
)
// Const definitions with digit separators for readability.
const (
min8DigitInt int64 = 10_000_000
max8DigitRange int64 = 90_000_000 // Covers range [0, 89,999,999]
codeUpperExclusive int64 = 100_000_000 // Covers range [0, 99,999,999]
)
// Generate8DigitNumber returns a cryptographically secure random 8-digit integer
// between 10,000,000 and 99,999,999 (inclusive). Guaranteed to start with digits 1-9.
func Generate8DigitNumber() (int64, error) {
// crypto/rand.Int generates a random big.Int in the uniform range [0, max).
// We pass max8DigitRange (90,000,000) to get a random offset in [0, 89,999,999].
n, err := rand.Int(rand.Reader, big.NewInt(max8DigitRange))
if err != nil {
return 0, fmt.Errorf("failed to generate secure random int: %w", err)
}
// Add min8DigitInt (10,000,000) to shift the range to [10,000,000, 99,999,999]
return min8DigitInt + n.Int64(), nil
}
// Generate8DigitCode returns a cryptographically secure 8-character numeric string code
// between "00000000" and "99999999". Preserves leading zeros using fmt.Sprintf,
// making it suitable for OTPs, PINs, or verification tokens.
func Generate8DigitCode() (string, error) {
// Generate an integer in the range [0, 99,999,999]
n, err := rand.Int(rand.Reader, big.NewInt(codeUpperExclusive))
if err != nil {
return "", fmt.Errorf("failed to generate secure random code: %w", err)
}
// Format as an 8-digit string with leading zeros (%08d)
return fmt.Sprintf("%08d", n.Int64()), nil
}
func main() {
// 1. Generate a mathematical 8-digit integer [10000000 to 99999999]
num, err := Generate8DigitNumber()
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Generated 8-digit integer: %d\n", num)
// 2. Generate an 8-character string code [00000000 to 99999999] preserving leading zeros
code, err := Generate8DigitCode()
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Generated 8-digit string code: %s\n", code)
}
/*
run:
Generated 8-digit integer: 11766012
Generated 8-digit string code: 03328841
*/