Programmeren in COBOL/Relatieve bestanden met hash: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
k Bot: Fixing redirects
Hasse (overleg | bijdragen)
Regel 163:
</pre>
}}
Dit is waar alles om draait, dit klein stukje code zorgt ervoor dat je via een woord of een naam een record zult kunnen plaatsen of vinden. We slaan eerst de naam van de wiki op in een hulpveld. Met dit hulpveld zullen we de hash-functie gebruiken. Eerst zorgen we ervoor dat alles in hoofdletters staat via de INSPECT(zie [[Programmeren in COBOL/Bewerkingen/Werken met tekst|Werken met tekst]]). Als dat gebeurtgebeurd is moeten we alles omzetten in een cijfer; dit doen we ook via INSPECT. Wikinaam is nogsteedsnog steeds een alfanumeriek veld en hiermee kan je niet rekenen. ditDit moeten we eerst in een numeriek veld overzetten. Het getal dat we nu hebben is 11 tekens lang, goed voor 100 miljard mogelijke combinaties. Dit is natuurlijk teveel van het goede we hebben maar 9 records datdie we willen opslaan. De oplossing is het getal delen door het aantal records dat we willen opslaan. De uitkomst ervan interesseert ons niet want dat is nogsteedsnog steeds meer dan 10 miljard. Wat ons wel interesseert is de restwaarde, dat zal een getal zijn van 0 tot 8. Dat zijn 9 verschillende combinaties. Maar aangezien COBOL niet zero-basesbased is in vergelijking met bijvoorbeeld Java moeten we er één bij optellen. Dit geeft ons dan een getal van 1 tot 9 en slaan we op in het veld dat dient als RELATIVE KEY, in dit geval nummer. Vervolgens gaan we terug naar het deelprogramma zoeken.
 
Opmerking: Hoe je precies aan het eindgetal komt maakt eigenlijk niet uit zolang je maar aan een getal komt diedat gebaseerd is op de naam of het woord en diedat genoeg kans loopt om te verschillen met de getallen van andere namen of wordenwoorden.
{{code
|Taal= COBOL
Regel 181:
</pre>
}}
De hash functie is juist gebeurtgebeurd. We hebben dus een sleutel en we lezen vervolgens het relatief bestand. Dit is meteen de reden waarom we het geopend hebben als I-O: we moeten het bestand ook lezen omdat we moeten zien of er niet al geeneen record op die plaats is. Als er geen record is op die plaats dan krijgen we een INVALID KEY, hier ''slechtesleutel'' genaamd. INVALID KEY betekent hier ironisch genoeg dat het goed is want op de plaats van onze sleutel is er geen record dus kunnen we daar een record wegschrijven. Maar wat als er wel een record is? Hiervoor kunnen er 3 oorzaken zijn: ofwel heeft toevallig een ander record dezelfde sleutel gekregen van de hashfunctie of hebben we het record al een keer weggeschreven of we hebben al 9 records weggeschreven. Aan de twee laatste kunnen we niet veel doen als het record al weggeschreven is maakt het niet veel uit en als we al 9 records hebben weggeschreven moeten we het programma aanpassen zodat we toch meer dan 9 records kunnen gebruiken. Als er toevallig een andereander record hetzelfdedezelfde sleutel heeft gekregen noemen we dat een botsing of collision. Dit is niet erg en het gebeurdgebeurt vrijwel altijd. Het simpelste wat we kunnen doen om het op te lossen is gewoon één bij tellenbijtellen bij de sleutel en het opnieuw te proberen, dit gebeurt in het deelprogramma botsing. Het is bijna gedaan want nu gaan we al terug naar het deelprogramma ''omzetten''.
{{code
|Taal= COBOL
Regel 198:
</pre>
}}
Onthoud INVALID KEY betekende in dit geval goed en daardoor is het veld ''slechtesleutel'' geactiveerd. Vervolgens gebeurdgebeurt net hetzelfde als bij een gewoon relatief bestand. Schrijf alles weg en lees het volgende record van het sequentiële bestand. Als alle records zijn gelezen sluit de twee bestandbestanden en het programma heeft zijn werk gedaan.
 
==Relatief bestand met hash lezen==
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.