Hashing

Hashing er – ligesom alle de andre datastrukturer – en måde at gemme data på, som giver nogle fordele. Her får vi en hurtigere adgang til data end med f.eks. en almindelig Linked-List.

Jeg skal forklare kort hvad det går ud på:

1.      Vi gemmer data i en MINDRE liste(HashTable) end det antal af elementer vi ønsker at gemme. Dette kan lyde som en modsigelse. Optimalt vil være at Hash Tabellen er samme størrelse som antal elementer.

2.      Vi bruger bare denne liste(HashTable) som startpunkt. Resten af data er gemt som linked-list.

3.      Vi må have en måde at bestemme hvilke data skal hvorhen i hash tabellen. Til dette bruges en Hash function.

 

Nedenfor her er en tegning som viser Hashing. Først har vi nogle data elementer vi ønsker at gemme. Hvert element har Navn og data ( Et eks:  Navn=Allan, Data=Hav en god dag). Navn er vores Key. Vi sender så vores elementer til hashfunktionen. Den bestemmer så hvor elementerne skal placeres. Dette besluttes ud fra Key´en og selve hash funktinone. I vores tilfælde bruger vi KUN første bogstav i navnet som Key. Og vi placerer elementerne fordelt over alfabetet. Vi har her 7 positioner i Hash Tabellen, som passer præsis til hash funktionen. Det er denne tabel sammen med funktionen, som gør Hashing så hurtig, fordi ved ved akkurat hvor vi skal starte vores søgnin eller indsætning. Men selvfølgelig, må der være et fornuftig forhold i mellem hvor mange elementer der skal gemmes og hvor mange positioner vores Hash tabel har. Det er beslutninger man som udvikler tager ud fra hvad der skal gemmes, men det kommer vi ikke ind på her.

 

F.eks. Placeres Per i pos 3 fordi Per starte med P og P bogstaven har pos 3, sammen med bogstaverne M, N og O.

Hashing

Figur 1 Hashing

Hvis intet element er i listen, så placeres dette bare i listen. Men hvis der allerede findes et eller flere elementer, så LINKER vi dem sammen (lige som vi har gjordt med linke-list). Du kan se at Pos 0 har fire elementer. Og sidst er Allan, fordi han er den som kom først ind, og vi indsætter nye elementer foran hele tiden, som resulterer i at den sidste som kommer ind er fremst i listen.

 

 

Implimentering af Figur 1.

   

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace Hashing

{

    public partial class Form1 : Form

    {

        Person[] HashTable = new Person[7]; //Der er kun 7 pladser.

        public Form1()

        {

            InitializeComponent();

            Person p1 = new Person("Allan", "Hav en god dag");

            Person p2 = new Person("Karl", "Sådan");

            Person p3 = new Person("Yogy", "det ved jeg ikke");

            Person p4 = new Person("Per", "Måske");

            Person p5 = new Person("Arne", "bil er ikke min stil");

            Person p6 = new Person("Bent", "Nej ikke i dag");

            Person p7 = new Person("Yonny", "det må jeg sige");

            Person p8 = new Person("Wee", "iPad");

            Person p9 = new Person("Finn", "Windows");

            Person p10 = new Person("Asker", "lone er min kone");

            Person p11 = new Person("Wisky", "drikke");

            insertPerson(p1);

            insertPerson(p2);

            insertPerson(p3);

            insertPerson(p4);

            insertPerson(p5);

            insertPerson(p6);

            insertPerson(p7);

            insertPerson(p8);

            insertPerson(p9);

            insertPerson(p10);

            insertPerson(p11);

            printHashTable();

        }

        public int hashFunction(String  Navn)

        {

            int svar = 0;

             /*

               Pos 0:   A B C D

               Pos 1:   E F G H

               Pos 2:   I J K L

               Pos 3:   M N O P

               Pos 4:   Q R S T

               Pos 5:   U V W X

               Pos 6:   Y Z Æ Ø Å null

              

               hvis en Person´s navn starter med f.eks. C så skal denne

               Person indsættet i HashTable pos 0.

             */

            String navn = Navn.ToLower();

            char c = navn[0];

 

            if(c.Equals('a') || c.Equals('b') ||c.Equals('c') ||c.Equals('d'))

            {

                svar = 0;

            }

            if (c.Equals('e') || c.Equals('f') || c.Equals('g') || c.Equals('h'))

            {

                svar = 1;

            }

            if (c.Equals('i') || c.Equals('j') || c.Equals('k') || c.Equals('l'))

            {

                svar = 2;

            }

            if (c.Equals('m') || c.Equals('n') || c.Equals('o') || c.Equals('p'))

            {

                svar = 3;

            }

            if (c.Equals('q') || c.Equals('r') || c.Equals('s') || c.Equals('t'))

            {

                svar = 4;

            }

            if (c.Equals('u') || c.Equals('v') || c.Equals('w') || c.Equals('x') )

            {

                svar = 5;

            }

            if (c.Equals('y') || c.Equals('z') || c.Equals('æ') || c.Equals('ø') || c.Equals('å') || c.Equals(' '))

            {

                svar = 6;

            }

 

            return svar;

        }

 

        public void insertPerson(Person p)

        {

            int pos = hashFunction(p.navn);

            if (HashTable[pos] == null)

            {

                HashTable[pos] = p;

            }

            else

            {

                p.next = HashTable[pos];

                HashTable[pos] = p;

            }

        }

        public String getData(String Navn)

        {

            String  svar = "findes ikke i systemet";

            int pos = hashFunction(Navn);

            if (HashTable[pos] == null)

            {               

            }

            else

            {

                Person p = HashTable[pos];

                while (p != null)

                {

                    if (p.navn.Equals(Navn))

                    {

                        svar = p.data;

                    }

                    p = p.next;

                }

            }

            return svar;

 

        }

        public void printHashTable()

        {

            int teller = 0;

            foreach (Person p in HashTable)

            {

                Console.WriteLine("------------------ "+teller+" ---------------------");

                teller++;

                Person holder = p;

                while (holder != null)

                {

                    Console.WriteLine(holder.navn + " : " + holder.data);

                    holder = holder.next;

                }

            }

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            textBox1.Text = getData(textBox1.Text);

        }

    }

 

    public class Person

    {

        public String navn;

        public String data;

        public Person next = null;

        public Person(String Navn, String Data)

        {

            navn = Navn;

            data = Data;

        }

    }

}

 

 

 

Fagudtryk(Hashing)

Hashing

Hashing er – ligesom alle de andre datastrukturer – en måde at gemme data på, som giver nogle fordele. Her får vi en hurtigere adgang til data end med f.eks. en almindelig Linked-List.

Hash table

Tabellen holder vores data.

Hash Function

Key (nøgle)

Denne funktion bruges både til at gemme og hente data. Når du gemmer en data, så bruger du en nøgle som alt gemmes og hentes udfra. Disse nøgler grupperes så grupper. Og det er derfor vi har en Hash Tabel som har f.eks 7 pladser.