Phone Hash Directory

SHA-1, SHA-256, MD5 hash lookup for phone numbers

Testing & QA with Phone Hashes

Testing and QA with Phone Hashes

QA engineers and developers need to verify that phone hashing pipelines work correctly—without using production PII in test environments. This guide covers test phone hash strategies, QA hash testing workflows, and best practices for building reliable test suites around hashed phone numbers.

Why Test Phone Hashes?

  • Pipeline correctness: Ensure normalization, hashing, and lookup produce expected results.
  • Regression prevention: Catch breaking changes when format or algorithm changes.
  • Integration validation: Verify that your system matches partners' hashes when using the same normalization.
  • Compliance: Demonstrate that hashing is implemented correctly for audits.

Test Data Strategy

Never use production phone numbers in tests. Use:

  • Synthetic numbers: Generate numbers in valid formats but not assigned to real users (e.g., 555 area code in US is reserved for fiction).
  • Test number ranges: Some countries reserve ranges for testing (e.g., +1-555-xxx-xxxx in NANP).
  • Known test set: Maintain a small set of numbers and their expected hashes; use for deterministic tests.

Building a Test Hash Reference

Create a reference table of test numbers and their expected hashes:

Phone (E.164) MD5 SHA-256 (truncated)
+15551234567 5d41402abc4b2a76b9719d911017c592 e3b0c44298fc1c...
+442071234567 (compute and store) (compute and store)

Generate hashes once using a trusted tool (e.g., our phone-to-hash tool) and store in version control. Use for assertions in tests.

Unit Testing Hash Generation

def test_phone_hash_md5():
    from your_module import hash_phone
    phone = "+15551234567"
    expected = "5d41402abc4b2a76b9719d911017c592"  # Pre-computed
    assert hash_phone(phone, algorithm="md5") == expected

Test each algorithm (MD5, SHA-1, SHA-256) and multiple formats (E.164, national) to ensure normalization is correct.

Integration Testing with Hash Lookup

When testing against our API or hash directory:

  • Mock in CI: Use mocks or fixtures to avoid external dependencies in fast CI runs.
  • Contract tests: Verify request/response format; use a staging API if available.
  • Smoke tests: Periodically run against production API to catch breaking changes (respect rate limits).

See our developer API guide for API details.

Testing Normalization

Normalization bugs are common. Test that these produce the same hash:

  • +15551234567
  • (555) 123-4567 (with US default)
  • 555-123-4567 (with US default)
  • 1 555 123 4567

All should hash to the same value when normalized to E.164. Add tests for international numbers (UK, Germany, etc.) if you support them.

Edge Cases to Test

  • Empty input: Should reject or return error.
  • Invalid format: Non-numeric, wrong length, invalid country code.
  • Unicode: Ensure no BOM or special characters affect the hash.
  • Whitespace: Leading/trailing spaces should be stripped or rejected.

Test Data Management

Maintain a test data repository with known phone numbers and their hashes. Use synthetic numbers (e.g., 555 range in US) or numbers explicitly reserved for testing. Never copy production data into test environments—even if anonymized, the risk of leakage or misuse is too high. Version your test data with your code; when you change normalization, update the expected hashes in the same commit. Consider a separate test data service or fixture file that all teams consume for consistency. Centralizing test data reduces duplication and ensures that when normalization changes, one update propagates to all tests. Use CI to verify that test data hashes match expected values—if they don't, the test data or normalization has changed and needs review.

QA Hash Testing in Staging

In staging environments:

  • Load test data with known hashes.
  • Run pipelines end-to-end; verify output hashes match expected.
  • Test reverse lookup (if authorized) with known hash-to-number pairs.
  • Verify that lookup failures are handled correctly (e.g., hash not found).

Debugging Failed Tests

When tests fail, use our debugging hashed phones guide. Common causes: normalization mismatch, algorithm difference, encoding issue. Log the actual vs. expected hash and the input string (redact if needed) to diagnose.

Summary

Performance and Load Testing

When testing hash pipelines at scale, use synthetic data generators. Create millions of valid-format numbers (e.g., sequential or random within valid ranges) and hash them. Measure throughput, latency, and error rates. Identify bottlenecks—hashing is usually fast; I/O or API rate limits often constrain performance. Use our API's batch endpoints for load testing; respect rate limits and use a test or staging environment when available.

Continuous Integration

Include hash-related tests in CI. Run unit tests on every commit. Run integration tests against a staging API on every merge to main. Fail the build if tests fail. Add hash validation tests when you add new algorithms or change normalization. Regression tests catch format changes that might otherwise slip into production. Configure CI to run hash tests in parallel with other test suites to minimize impact on build time. Use test sharding if the suite grows large. Ensure that flaky tests (e.g., those depending on external API availability) are isolated and don't block the main build—use retries or separate jobs for those. For external API tests, consider a nightly or weekly job that runs against production (with rate limit awareness) rather than on every commit. This balances the need for production validation with the cost of external dependencies. If the nightly test fails, investigate before it affects users. Add the test results to your team's dashboard or status page so everyone sees the health of your hash integrations at a glance. When an integration fails, the dashboard provides immediate visibility. Include links to test logs and runbooks for common failures. This reduces mean time to detection and resolution. For multi-team organizations, a shared dashboard ensures that hash integration health is not siloed within a single team.

Summary

Use synthetic test data and pre-computed expected hashes. Test normalization, hashing, and lookup. Never use production PII. For hash generation and verification, use our phone-to-hash and hash directory tools. For debugging, see our debugging guide.

Explore Phone Hash Directory