IDENTIFICATION DIVISION.
PROGRAM-ID. Generar-Archivo-Relativo.
DATA DIVISION.
FILE SECTION.
FD Archivo-Entrada.
01 Registro-Entrada.
05 Campo-Clave-Entrada PIC X(10).
05 Campo-Datos-Entrada PIC X(30).
FD Archivo-Salida.
01 Registro-Salida.
05 Campo-Clave-Salida PIC X(10).
05 Campo-Datos-Salida PIC X(30).
WORKING-STORAGE SECTION.
01 Hash-Tabla OCCURS 100 TIMES.
05 Hash-Clave PIC X(10).
05 Hash-RRN PIC 9(3).
01 Hash-Overflow OCCURS 100 TIMES.
05 Overflow-Clave PIC X(10).
05 Overflow-RRN PIC 9(3).
01 EOF-Salida PIC X VALUE 'N'.
01 Indice PIC 9(3).
01 Clave-Buscar PIC X(10).
01 RRN-Encontrado PIC 9(3).
PROCEDURE DIVISION.
Inicio.
OPEN INPUT Archivo-Entrada
OUTPUT Archivo-Salida.
PERFORM Leer-Archivo-Entrada UNTIL EOF-Salida = 'Y'.
CLOSE Archivo-Entrada
Archivo-Salida.
STOP RUN.
Leer-Archivo-Entrada.
READ Archivo-Entrada
AT END
MOVE 'Y' TO EOF-Salida
NOT AT END
PERFORM Calcular-Hash
PERFORM Buscar-En-Tabla.
Calcular-Hash.
COMPUTE Indice = FUNCTION MOD (FUNCTION NUMVAL (Campo-Clave-Entrada), 100) + 1.
MOVE Campo-Clave-Entrada TO Hash-Clave(Indice).
MOVE 1 TO Hash-RRN(Indice).
Buscar-En-Tabla.
MOVE Campo-Clave-Entrada TO Clave-Buscar.
MOVE 0 TO RRN-Encontrado.
PERFORM Buscar-En-Tabla-Principal
UNTIL RRN-Encontrado > 0
OR Indice > 100.
IF RRN-Encontrado = 0
THEN
MOVE Clave-Buscar TO Overflow-Clave(Indice).
MOVE 1 TO Overflow-RRN(Indice).
PERFORM Escribir-En-Tabla-Overflow
ELSE
MOVE RRN-Encontrado TO RRN-Encontrado
PERFORM Escribir-En-Tabla-Principal.
Buscar-En-Tabla-Principal.
IF Hash-Clave(Indice) = Clave-Buscar
THEN
MOVE Hash-RRN(Indice) TO RRN-Encontrado
ELSE
ADD 1 TO Indice
IF Indice > 100
THEN
MOVE 0 TO RRN-Encontrado
END-IF.
Escribir-En-Tabla-Overflow.
MOVE Overflow-Clave(Indice) TO Campo-Clave-Salida.
MOVE Campo-Datos-Entrada TO Campo-Datos-Salida.
WRITE Registro-Salida.
Escribir-En-Tabla-Principal.
MOVE Hash-Clave(Indice) TO Campo-Clave-Salida.
MOVE Campo-Datos-Entrada TO Campo-Datos-Salida.
WRITE Registro-Salida.