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

Verwijderde inhoud Toegevoegde inhoud
Sephiroth (overleg | bijdragen)
Sephiroth (overleg | bijdragen)
Regel 94:
PERFORM VARYING teller FROM 1 BY 1 UNTIL slechtesleutel
OR seqnaam = relnaam OR teller > 9
PERFORM BOTSINGbotsing
READ wikirel INVALID KEY CONTINUE END-REAdREAD
END-PERFORM.
 
Regel 132:
{{code
|Taal= COBOL
|Titel=De bestanden benaderenHoofd.
|Code=
<pre>
Regel 147:
{{code
|Taal= COBOL
|Titel=De bestanden benaderen.Hash-functie
|Code=
<pre>
Regel 159:
</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/Werken met tekst|Werken met tekst]]). Als dat gebeurt is moeten we alles omzetten in een cijfer dit doen we ook via INSPECT. Wikinaam is nogsteeds een alfanumeriek veld en hiermee kan je niet rekenen dit 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 dat 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 nogsteeds 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-bases is in vergelijkvergelijking 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 die gebaseerd is op de naam of het woord en die genoeg kans loopt om te verschillen met de getallen van andere namen of worden.
{{code
 
|Taal= COBOL
|Titel=Zoeken.
|Code=
<pre>
ZOEKEN.
PERFORM hash
READ wikirel INVALID KEY CONTINUE END-READ
PERFORM VARYING teller FROM 1 BY 1 UNTIL slechtesleutel
OR seqnaam = relnaam OR teller > 9
PERFORM botsing
READ wikirel INVALID KEY CONTINUE END-READ
END-PERFORM.
</pre>
}}
De hash functie is juist gebeurt. 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 al geen 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 andere record hetzelfde sleutel heeft gekregen noemen we dat een botsing of collision. Dit is niet erg en het gebeurd vrijwel altijd. Het simpelste wat we kunnen doen om het op te lossen is gewoon één bij tellen bij de sleutel en het opnieuw te proberen, dit gebeurt in het deelprogramma botsing.
{{beg}}
 
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.