Ankündigung

Einklappen
Keine Ankündigung bisher.

Algorithmen oder .. ? (Hash zu Eigenschaften, von Telefonnummer zum Universum)

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Algorithmen oder .. ? (Hash zu Eigenschaften, von Telefonnummer zum Universum)

    Hallo zusammen,

    an der Überschrift erkennt ihr es: Ich verstehe nicht worum es geht. Bzw. wie es geht.
    Ich entwickle schon seit etwa 15 Jahren als Hobby PHP, MySQL, Python etc.

    Neulich habe ich gelesen, dass das Spiel "No Mans Sky" angeblich auf einer Telefonnummer basiert.
    Puh, das klingt cool - aber mal ehrlich, wie funktioniert das?

    Ich habe versucht zu googeln, aber ich weiß echt nicht so wirklich wonach ich suchen soll. Wenn ich Telefonnummer zu Universum google, könnt ihr euch vorstellen wie sinnlos das ist.
    Jetzt gibt es seit kurzen Crypto-Kitties. Riesen Hype, legen das Ethereum Netzwerklahm - aber das interessiert mich weniger. Ich fand das Kreuzen der Katzen anhand von Genen eher cool (aus Entwickler-Sicht).
    Cattributes schimpft sich das bei denen: https://cryptokittydex.com/cattributes/manx
    Drei Katzen mit dem Gen "Manx". Scheint ziemlich selten und bleibt zu sein, hat aber nichts mit dem Thema zu tun.

    Wenn ihr den Link anklickt, seht ihr dort die Gene der Katze.
    https://cryptokittydex.com/kitties/285374
    Unter diesem Link findet ihr die kompletten Gene.

    Doch, wie realisiert man sowas?
    Es scheint eine Art Hash zu sein, ähnlich wie beim Spiel No Mans Sky, die Telefonnummer ja nichts anderes ist.

    Ich habe echt keine Idee, wie man das Umsetzt.
    Nehmen wir an ich habe bei z.b. einer Katze 2 Eigenschaften (der Einfachheit halber).

    Farbe, AugenFarbe

    Geht man hin, sagt die erste Stelle vom Hash bestimmt die Farbe, die zweite Stelle die Augenfarbe..?
    Wandelt man den Hash einfach in Bits um und hat super viele an/aus Eigenschaften?

    Oder oder oder? Vielleicht kann mir auch nur einer einen Begriff nennen, nachdem ich suchen kann und mich selbst einlesen kann?

    Danke an euch schon mal

    Lg


  • #2
    MOD: Verschoben von PHP-Fortgeschritten
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3

      https://www.heise.de/newsticker/meld...n-3907779.html

      Kommentar


      • #4
        wow..

        Kommentar


        • #5
          Der Hash/Telefonnummer nennt sich Seed. Dieser Wert wird als Eingabeparameter für eine mathematische Funktion genutzt, die dir damit reproduzierbar/determistisch endlos "Zufallsdaten" liefert. Diese Zufallsdaten unterteilst du dann in die gewünschte Eigenschaften. Z.B. die ersten 8 Byte sind die Augenfarbe, Byte 9 bis 16 die Felllänge usw...

          Ganz primitv könnte das z.B. so aussehen: (die mathematische Funktion ist in dem Fall der pseudo Zufallsgenerator von PHP, darauf würde ich mich in der praixs aber nicht verlassen!)

          PHP-Code:
          $seed 55;


          $rand = [];
          srand($seed);
          $rand[] = rand();
          srand(rand());
          $rand[] = rand();
          srand(rand());
          $rand[] = rand();
          srand(rand());
          $rand[] = rand();


          $augen_farbe map_rand_to_color($rand[0]);
          $fell_laenge map_rand_to_length($rand[1]);
          $fell_farbe map_rand_to_color($rand[2]);

          function 
          map_bytes_to_color($value) {
              if(
          $value 5000) return 'rot';
              if(
          $value 50000) return 'gelb';
              if(
          $value 500000) return 'gründ';
              return 
          'schwarz';

          Kommentar


          • #6
            puh.. jetzt findet man im netz schon was mehr, danke

            aber so ganz mag ich deinen Quelltext nicht verstehen..
            wieso kommen keine Zufallszahlen, wenn du so oft rand() verwendest.
            irgendwie verstehe ich wohl srand() nicht so ganz.

            du legst mit srand den startwert für rand auf 55. raus kommt aber (bei mir) immer 707676680.
            bahnhof..

            ich mein, mir ist klar, dass dein Beispiel nur ein Beispiel ist. Und ich verstehe auch, was du damit sagen willst. Nur konkret verstehe ich es nicht..

            Kommentar


            • #7
              rand() ist ein Pseudozufallszahlengenerator. Die Werte sehen zufällig aus, sind aber berechnet. Da steckt eine Funktion dahinter wie z.B. "f(x)=a*x+b mod c" wobei x der Seed ist und a,b,c konstante Werte. Ich weiß nicht wie es Mathematisch bei dir aussieht. Vielleicht etwas konkreter. Der Zufallsgenerator sieht z.B. so aus f(x)=x*2. Es ist unschwer zu erkennnen, dass der nicht viel taugt, aber zum verdeutlichen ist das egal.

              In PHP würde das so aussehen:
              PHP-Code:
              function myRand($seed) {
                  return 
              $seed*2;

              Den Seed willst du i.d.R. nicht durchreichen, wenn du Zufallszahlen haben willst. Der ist also global gesetzt:

              PHP-Code:
              $seed 1;
              function 
              myRand() {
                  global 
              $seed;
                  
              $seed $seed*2//überschreibt damit gleichzeitig den globalen Wert!
                  
              return $seed;

              Und um den seed zu setzen die zugehörige srand() Funktion.

              PHP-Code:
              function mySRand($new_seed) {
                  global 
              $seed;
                  
              $seed $new_seed//überschreibt den global Wert!

              Schaut dann so aus:
              PHP-Code:
              echo myRand(); -> 2
              echo myRand(); -> 4
              echo myRand(); -> 
              PHP-Code:
              mvSRand(10)
              echo 
              myRand(); -> 20
              echo myRand(); -> 40
              echo myRand(); -> 80 
              Vom Prinzip her steckt genau das gleiche hinter rand(). Der Unterscheid ist, dass PHP den globalen seed vorinitialisiert mit z.B. der Uhrzeit und die verwendete mathematische Funktion deutlich besser "streut" als x*2.

              Ich hoffe das erklärt warum du immer die selben "zufälligen" Werte bekommst, wenn du mit srand() den seed festlegst. In dem Beispiel Code aus dem letzten Post reicht auch srand() einmal auszuführen. Ich war gedanklich ein Stück weiter.

              PS: Das dient nur zum verdeutlichen und nicht als "so sollst du das implementieren". rand() eigent sich überhaupt nicht dafür, weil nicht garantiert ist, dass das auf jeder Platform und allen Versionen das selbe Ergebnis liefert. Da ist die Katze am Ende auf dem einen System Lila und auf dem anderen Gelb. Mit dem Begriff Pseudozufallszahlengenerator solltest du aber bei Google weiter kommen.

              Kommentar


              • #8
                du legst mit srand den startwert für rand auf 55. raus kommt aber (bei mir) immer 707676680.
                Mit dem gleichen Seed bekommst du immer die gleiche "Zufallszahl". Wenn du den weglässt setzt PHP den Seed für dich.

                Besser ist da http://php.net/manual/de/function.mt-rand.php Erzeugt "bessere" Zufallszahlen

                https://de.wikipedia.org/wiki/Mersenne-Twister

                LG
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Zitat von hausl Beitrag anzeigen
                  Besser ist da http://php.net/manual/de/function.mt-rand.php Erzeugt "bessere" Zufallszahlen
                  "As of PHP 7.1.0, rand() uses the same random number generator as mt_rand()."

                  http://php.net/manual/en/function.rand.php

                  Kommentar


                  • #10
                    hellbringer ah.. Danke!

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      wieso nicht
                      http://php.net/manual/de/function.random-bytes.php => 7.0
                      bzw.
                      http://php.net/manual/de/function.mcrypt-create-iv.php < 7.0

                      Kommentar


                      • #12
                        Ahhh, okay, danke - das erklärt einiges.
                        rand ist vereinfacht gesagt ne mathematische Funktion, die basierend auf der zeit eine zahl liefert. lasse ich den seed weg übernimmt php als Beispiel die zeit.

                        halbwegs richtig erklärt? Mir ist klar, dass das nur Beispiele sind

                        Man geht also hin, teilt so ein hash in x-abschnitte ein (z.b. alle 8 Byte) und sagt, der erste legte diese Funktion fest, die Zeiten bit eine weitere und so weiter?
                        Das ist der ganze Zauber? Klar, ist das schwer, aber irgendwie einfacher als ich dachte.

                        Es ist irgendwie mehr eine Fleiß-Arbeit, als einer Mathematischen Lösung, wie ich zuerst dachte.

                        Kommentar

                        Lädt...
                        X