Wort zu Zahl

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Wort zu Zahl

BeitragMo, Okt 20, 2008 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich versuche jetzt schon seit Stunden aus einem Wort eine Zahl zu machen.
Aber es gelingt mir nicht, dass eine Zahl nur ein Wort sein kann.
Also, damit man es besser versteht:
Code: [AUSKLAPPEN]
"einganzlangeswort"=zahl

Diese Zahl soll aber bei keinem anderen Wort rauskommen.

Ich hoffe ihr habt verstanden.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Eingeproggt

BeitragMo, Okt 20, 2008 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich habe ehrlich gesagt nicht verstanden.

Meinst du vielleicht
Code: [AUSKLAPPEN]
zahl="einganzlangeswort"


In dem Fall würd ich dir eine Suche nach "Hash" empfehlen (Hier im Forum weiß ich nicht ob es sowas gibt, also eine Suche auf Wikipedia)

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

The_Nici

BeitragMo, Okt 20, 2008 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze nennt man MD5-Hash und es gibt Links hier im Forum die zum BB-Com Codearchiv führen.
MfG

sheldon

BeitragMo, Okt 20, 2008 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es auch nicht ganz verstanden, aber vielleicht mit:

Code: [AUSKLAPPEN]
Const Ganzlangeswort = 1


Ich glaube die müsstest du aber kennen. Wink
Ist dann aber Konstant.

Goodjee

BeitragMo, Okt 20, 2008 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
md5 ist das richtige stichwort
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

the FR3AK

BeitragMo, Okt 20, 2008 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
MD5 enthält aber auch Buchstaben?

SpionAtom

BeitragMo, Okt 20, 2008 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja es kommt auch auf die Wortlänge an, bei 20 oder 30 Zeichen langen Strings ist MD5 doch eher mit Kanonen auf Spatzen schießen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Valnar

BeitragDi, Okt 21, 2008 0:38
Antworten mit Zitat
Benutzer-Profile anzeigen
sheldon hat Folgendes geschrieben:
Ich habe es auch nicht ganz verstanden, aber vielleicht mit:

Code: [AUSKLAPPEN]
Const Ganzlangeswort = 1


Ich glaube die müsstest du aber kennen. Wink
Ist dann aber Konstant.

So würde ich es auch machen, wenn das "ganzlangewort" nur 2,3 mal gibt.

Smily

BeitragDi, Okt 21, 2008 8:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weis nicht, ob ich Eisvogel richtig verstanden habe, aber ich glaube, er möchte einen Hash-Algo.

Ich würde mir da einfach selbst was machen. Dein Langes wort buchstabe für buchstabe durchgehen und die einzelnen ascii-werte irgendwie miteinander verrechnen. Dan müsstest du auf eine mehr oder weniger eindeutige Zahl kommen.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

D2006

Administrator

BeitragDi, Okt 21, 2008 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also grundsätzlich will er ein assoziatives Array. Also ein Array, das man nicht mit ganzstelligen Indexzahlen abfragt ( bla[1] = 4), sondern mit Zeichenketten ( bla("langeswort") = 42 ).

Dafür braucht er allerdings ne Hashmap und dafür wiederum ne Hashfunktion.

grobe Vorgehensweise: (nachfolgend ist "langeswort" der sog. Key und die Zahl halt die sog. Value)
Du erstellst dir zwei Arrays. Einen für die Keys und einen für die Zahl. Wenn du später einen Key speichern willst, kommt der in den gleichen Index wie die Zahl. Bsp wenn der Index 5 wäre: key_array[5] = "langeswort" und value_array[5]=42. Eine wichtige Frage, die du vorher klären musst, ist, wie viele solcher Verknüpfungen von keys zu values du brauchen wirst, denn die müssen ja alle in das Array passen. Mir wurde mal empfohlen, dass das Array zu zwei Dritteln voll sein soll, sobald die vorgesehene Zahl der keys erreicht wurde. Wenn du also 10 keys benutzen willst, sollten die beiden Arrays jeweils 15 Felder haben. Zweiter Knackpunkt ist nun die Hashfunktion. Die ist dafür da, aus dem übergebenen Key eine Zahl zu ermitteln. Genau diese Zahl wird der Index des Key (und des Values) in unserem Array. Wenn wir also 15 Arrayfelder haben, dann muss unsere Hashfunktion natürlich einen Wert zwischen 0 und 14 zurückliefern, sonst wird's Essig. Wichtig ist aber auch, dass die Hashfunktion nur "wenige Kollisionen" hat. Eine Kollision ist einfach nur, wenn zwei verschiedene Keys den gleichen Zahlenwert haben. Denn dann müsste man sie im selben Feld speichern. Das lässt sich aber ohnehin nicht vermeiden, also überlegen wir uns lieber, wie wir damit umgehen. Deswegen speichern wir nämlich die Keys separat auch nochmal mit. Wenn also ein Key "blubb" registriert wird und innerhalb der Hashmap den Arrayindex 5 zugewiesen bekommt und wir danach einen zweiten Key "foobar" registrieren, der dummerweise auch den Arrayindex 5 kriegt, machen wir folgendes: Wir stellen fest, dass auf Arrayindex 5 schon ein key ist, also prüfen wir die 6. Wenn da frei ist, packen wir es dorthin. Wenn nicht, auf zur 7. Usw. usf. Aufpassen: Wenn das Array zu Ende ist, machen wir bei 0 also ganz oben weiter. Und wenn wir wieder beim ursprünglichen errechneten Index 5 sind, ist die Hashmap voll. Das ist aber nur die halbe Miete, denn was ist, wenn wir nun "blubb" abrufen wollen? Dann errechnen wir wieder den Wert, kommen wieder auf 5, schauen in die Arrays und finden auf Position 5 "blubb". Supi, also fix den damit verbundenen Wert zurückliefern. Und bei "foobar", tja, wir schauen auf die 5 und da steht nur "blubb", also eins weiter gucken (und dann analog zu oben verfahren.)

Puuhhh, das war mal ein Crashkurs zum Thema Hashmapping. Es gibt übrigens noch anderer Vorgehensweise bei Kollisionen. Man könnte zum Beispiel bei Index 5 auf eine Liste verweisen, aber das geht in BB nur sehr schwer und ist eher in BlitzMax realisierbar. Diese Methode hier sollte also schon mal nicht schlecht sein.

Ach und euer MD5-Hash könnt ihr in die Tonne kloppen, der ist dafür unbrauchbar. Der erzeugt ja riesige Zahlen (die Buchstaben da drinnen sind ja hexadezimale Ziffern, womit die Zahl also noch größer ist). Da müsste man entweder eben so riesige Arrays anlegen (unmöglich!) oder den errechneten Hash nochmal mit Mod bearbeiten... aber dann kann ich auch fix ne eigene Hashfunktion schreiben.

Übrigens: Wenn nur gaaanz wenige Keys gespeichert werden sollen (so um die 10), dann kann man die auch einfach in ne Liste knallen und beim Abfragen die soweit durchgehen, bis man gefunden hat, was
man suchte. Ist zwar recht rechenintensiv, aber das wäre es bei wenigen Einträgen auch bei ner Hashmap. Die spielt erst bei vielen Einträgen ihre Trümpfe aus.

Und weil ich so nen Roman nicht immer schreiben will und das hier vielleicht später mal wiedergefunden wird, ein paar Stichwörter: Hashmap, Hash, Assoziation, Assoziatives Array, String Index, Zeichenkette.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

SpionAtom

BeitragDi, Okt 21, 2008 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
So eine Hashfunktion macht aber auch nur dann Sinn, wenn ständig neue Werte kommen, und alte Werte gehen.
Wenn du schon am Anfang deines Programmes alle Wörter hast, und die auch nicht mehr verändert werden, so gibt es sicherlich einfachere Verfahren, um jedem Wort einen Key zuzuweisen. Zb Beispiel könnte man die Wörter alphabetisch sortieren, und einfach durchnummerieren... Das wär dann auch eindeutig, wenn man dann die leicht herausfindbaren Doubletten rausnimmt.

Hashfunktionen haben leider immer Kollisionen. Eindeutigkeit würde einen zu großen Speicheraufwand bedeuten. Wenn du zb alle 10 Zeichenlangen Wörter speichern willst, wo "nur" Kleinbuchstaben drin sind, so bräuchtest du bereits 26^10 Bytes, Was das für 255 Zeichen und 50 zeichenlangen Wörtern bedeutet, sollte klar sein.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Der Eisvogel

BeitragDi, Okt 21, 2008 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz verstanden hab ich euch alle jetzt auch nicht.

Also, ich versuchs nochmal:
Einen Integer kann man ja auch als Hex angeben.
Dann wäre das Wort "Haus" in Hex "$48617573" und als Integer "1214346611".
Aber so kann man nur 4-stellige Wörter machen.
Ich möchte jetzt aber 10-stellige machen.
Ich hoffe das war jetzt verständlich.

EDIT: Das Wort ist am Anfang nicht bekannt, denn es soll vom Benutzter eingegeben werden.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragDi, Okt 21, 2008 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Zerleg dein wort in Teile à 4 Buchstaben und wandle die um.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Okt 21, 2008 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das deutsche Alphabet hat 30 Zeichen. Wenn man nun das ganze in Bits aufteilt, dann benötigt man bereits 5 Bits pro Zeichen, und man hat noch 2 weitere Zeichen zu Verfügung (zum Beispiel eines für Leerzeichen und eines nach Wunsch). Bei einem Integer mit 32 Bits könnte man lediglich 6 Zeichen unter bringen. 2 Bits bleiben dabei unbenuzt mit welchen man weitere 4 Zustände abspeichern könnte.

Nimmt man nun noch Zahlen mit rein, dann werden 6 Bits pro Zeichen benötigt (maximal 5 Zeichen pro Integer). Dafür hätte man dann noch 24 weitere Sonderzeichen zur Verfügung.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Der Eisvogel

BeitragDi, Okt 21, 2008 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, ich habs geschaft.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Matthias

BeitragDi, Okt 21, 2008 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Schade das ich jetzt zu spät bin, um dir zu helfen weil du es selbst schon geschaft hast.

Habe deshalb mein Beispiel im Codearchiv gepostet. Vieleicht wäre das eine Alternative für dich.

https://www.blitzforum.de/foru...hp?t=29681

Gruß Matz

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group