PowerShell Advanced Series

14. Generar un Hash único por fila (Checksum)

14. Generate a Unique Row Hash (Checksum)

Crear un código basado en el contenido para identificar rápidamente si un registro específico sufrió modificaciones de un mes a otro.

Create a content-based code to quickly identify whether a specific record changed from one month to another.

⚠️ Advertencia de ciberseguridad y producción ⚠️ Cybersecurity and production warning

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes scripts contra datos reales, ambientes de producción, carpetas compartidas, sistemas críticos o repositorios empresariales sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios y cumplimiento de los protocolos de ciberseguridad de tu organización.

This exercise is for learning and testing only. Do not run scripts against real data, production environments, shared folders, critical systems, or enterprise repositories without authorization, backups, prior testing, least-privilege permissions, change control, and compliance with your organization's cybersecurity protocols.

Objetivo del ejercicio

Exercise objective

Agregar una columna de checksum que represente el estado de una fila. Si algún campo clave cambia, el hash cambia también, facilitando auditorías, reconciliación mensual y control de cambios.

Add a checksum column that represents the state of a row. If any key field changes, the hash also changes, making audits, monthly reconciliation, and change control easier.

Datos sintéticos

Synthetic data

IDStatusMonto
1001Active2500
1002Active1800
1003Inactive0
1004Active3250

Ejemplo base

Base example

$cadena = "$($_.ID)-$($_.Status)-$($_.Monto)"
$hash = Get-FileHash -InputStream `
([IO.MemoryStream]::new([byte[]][char[]]$cadena)) `
-Algorithm MD5

Resultado esperado

Expected result

IDStatusMontoRow_Checksum
1001Active25009F3A...D21B
1002Active180071BC...90AF
1003Inactive054DE...118C
1004Active32508AA2...EF31

Script completo

Complete script

# ==========================================================
# PowerShell Advanced Topic 14
# Generate a Unique Row Hash / Checksum
# ==========================================================

$inputFile  = "C:\Data\Monthly_Records.csv"
$outputFile = "C:\Data\Monthly_Records_With_Checksum.csv"

$datos = Import-Csv $inputFile

$resultado = foreach ($row in $datos) {

    # Build a consistent string using the fields that define the record
    $cadena = "$($row.ID)-$($row.Status)-$($row.Monto)"

    # Convert the string into a memory stream
    $bytes  = [System.Text.Encoding]::UTF8.GetBytes($cadena)
    $stream = [System.IO.MemoryStream]::new($bytes)

    # Generate hash
    $hash = Get-FileHash -InputStream $stream -Algorithm MD5

    # Add checksum as a new property
    $row | Add-Member -NotePropertyName "Row_Checksum" -NotePropertyValue $hash.Hash -Force

    $row
}

$resultado | Export-Csv $outputFile -NoTypeInformation -Encoding UTF8

Write-Host "Process completed."
Write-Host "Output file: $outputFile"

Aplicaciones reales

Real-world applications

  • Comparar archivos mensuales.
  • Detectar cambios en registros maestros.
  • Auditar modificaciones en datos críticos.
  • Identificar filas alteradas sin comparar campo por campo.
  • Compare monthly files.
  • Detect changes in master records.
  • Audit modifications in critical data.
  • Identify changed rows without comparing every field manually.

Recomendaciones

Recommendations

  • Usar siempre el mismo orden de campos para crear la cadena.
  • Normalizar espacios, mayúsculas y formatos antes de generar el hash.
  • Conservar el hash anterior para comparación histórica.
  • Usar SHA256 si el proceso requiere mayor robustez.
  • Always use the same field order when building the string.
  • Normalize spaces, casing, and formats before generating the hash.
  • Keep the previous hash for historical comparison.
  • Use SHA256 when stronger hashing is required.

Valor del tópico

Topic value

Este patrón convierte una fila completa en una firma técnica. Es muy útil para reconciliación, auditoría, control de cambios y procesos ETL donde necesitamos saber qué registros cambiaron realmente.

This pattern turns a full row into a technical signature. It is highly useful for reconciliation, auditing, change control, and ETL processes where we need to know which records actually changed.