Seite 1 von 4

Schnelle HashTable

Verfasst: 09.09.2008 13:26
von cxAlex
Hallo. Ich suche ein schnelles Verfahren um eine Hashtable zu erstellen. Derzeit nutze ich PureDic (GDSL), was aber in manchen Anwendungen ab PB Version 4.2 zu IMA's führt. Die Hashtable sollte mindestens so schnell sein wie PureDic, mit der Boardsuche und auf PureBasic-Lounge hab ich nur Codes gefunden die schnellstenfalls 4x langsamer waren.

Kongret bräuchte ich folgende Funktionen:

Code: Alles auswählen

Table = CreateTable()
FreeTable(Table)
Table_Add(Table, Index.s, Value.l)
Table_Get(Table, Index.s)
Table_Exist(Table, Index.s)
Währe toll wenn jemand weiter weis/einen schnellen Algorythmus kennt.

Verfasst: 09.09.2008 13:30
von ts-soft

Verfasst: 09.09.2008 13:42
von cxAlex
Irgentwie hab ich das Gefühl als währe das 1:1 die selbe UserLib: compilier gleich groß,gleich schnell und immer noch dieselben IMA's.

Verfasst: 09.09.2008 13:49
von ts-soft
cxAlex hat geschrieben:Irgentwie hab ich das Gefühl als währe das 1:1 die selbe UserLib: compilier gleich groß,gleich schnell und immer noch dieselben IMA's.
Es liegt dieselbe statische Lib zugrunde. Der Wrapper ist von edel, der
Source wurde auch schon mal wo gepostet, schon bevor es eine andere Lib
gab :wink:
Deine IMA's kann ich ohne Source jedoch nicht nachvollziehen.

Verfasst: 09.09.2008 13:55
von cxAlex
Ja, der Source währe toll. Im allgemeinen währe mir ein Include wesentlich lieber als eine UserLib.

Verfasst: 09.09.2008 13:59
von Kiffi
@cxAlex:

Der edel-Wrapper läuft bei mir schon seit längerem ohne Probleme.

srod hat auch irgendwas hashtabliges veröffentlicht.
Musst mal im engl. Forum suchen

Grüße ... Kiffi

Verfasst: 09.09.2008 14:02
von NicTheQuick
Von mir gibt es auch noch was.
Das kannst du ja mal ausprobieren. Ich weiß aber nicht, mit welchen PB-Version das
gemacht wurde. Könnte also sein, dass du evtl. den Source irgendwo noch ändern musst.
Das siehst du dann ja.

Hier der Link

Verfasst: 09.09.2008 14:05
von STARGÅTE
ich habe auch was kleines ^^

Code: Alles auswählen



Macro NewArray(Array, Struc)
 Global Dim _#Array.Struc(0)
 Global NewList ___#Array.s()
 Procedure __#Array(Field.s)
  ForEach ___#Array()
   If ___#Array() = Field
    ProcedureReturn ListIndex(___#Array())
   EndIf
  Next
  ReDim _#Array.Struc(CountList(___#Array()))
  AddElement(___#Array())
  ___#Array() = Field
  ProcedureReturn ListIndex(___#Array())
 EndProcedure
EndMacro
Macro Array(Array, Field)
 _#Array(__#Array(Field)) 
EndMacro
 



Structure MyStructure
 Long.l
 String$
EndStructure

NewArray(MyArray, MyStructure) 

Array(MyArray,"Ich")\Long = 123
Array(MyArray,"Ich")\String$ = "LaberICH"
Array(MyArray,"Du")\Long = 246
Array(MyArray,"Du")\String$ = "LaberDU"

Debug Array(MyArray,"Ich")\String$
Debug Array(MyArray,"Irgendwer")\String$
Debug Array(MyArray,"Du")\String$
Debug Array(MyArray,"Du")\Long
Debug Array(MyArray,"Ich")\Long

Verfasst: 09.09.2008 14:16
von cxAlex
@NicTheQuick:

Deinen Beitrag hab ich schon mit der Boardhilfe gefunden,ist aber zu langsam, da du da MD5 u.a. Funktionen verwendest die das ganze ausbremsen.

@Kiffi:

Den Source von srod kann ich leider nicht brauchen da ich nicht im Vorraus weis wie viele Elemente die Table enthält.

Verfasst: 09.09.2008 14:21
von NicTheQuick
Da ist auch ein Callback dabei, mit dem du deinen eigenen Hash basteln kannst. Wenn du
nur Strings hashen willst, dann kannst du theoretisch als Hash auch einfach den String
selbst im Callback zurückgeben. Oder du nimmst einen CRC32 oder sonstwas schnelles.

Im Grunde kann das langsame immer nur der Hashgenerator sein.