Wort zu Zahl
Übersicht

![]() |
Der EisvogelBetreff: Wort zu Zahl |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ganze nennt man MD5-Hash und es gibt Links hier im Forum die zum BB-Com Codearchiv führen.
MfG |
||
![]() |
sheldon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe es auch nicht ganz verstanden, aber vielleicht mit:
Code: [AUSKLAPPEN] Const Ganzlangeswort = 1
Ich glaube die müsstest du aber kennen. ![]() Ist dann aber Konstant. |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
MD5 enthält aber auch Buchstaben? | ||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Ist dann aber Konstant. So würde ich es auch machen, wenn das "ganzlangewort" nur 2,3 mal gibt. |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Ü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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group