Schnelle HashTable

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Schnelle HashTable

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Ja, der Source währe toll. Im allgemeinen währe mir ein Include wesentlich lieber als eine UserLib.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Antworten