Tom P.: Zahlensystem wie "hex", aber mit allen Buchstaben?

Hallo Leute,

ich hab's nicht so mit dem programmieren, daher weiss ich nicht recht weiter, vielleicht kann ja einer was schlaues beitragen:

Ich habe Funktion, die möglichst kompakte IDs für Dateinamen erzeugen soll. Das Prinzip ist dieses:

$referenznummerX=1234567
$referenznummerY=9876543

Aus diesen Nummern würde sich jetzt der Dateiname "1234567-9876543" generieren.

Um ein wenig kompakter zu sein, wandle ich das ganze noch in Hexadezimalschreibweise um, also "12D687-96B43F"

Kennt jemand eine Routine oder Möglichkeit, mit PHP ein System zu nutzen, welches _alle_ Buchstaben des Alphabets sowie 0-9 verwendet? Dadurch liesse sich der Name noch weiter verkürzen und man hätte sowas wie: "8vcy3-kkz17"

Für jeden Tipp sehr dankbar,
Tom

  1. Hi,

    Um ein wenig kompakter zu sein, wandle ich das ganze noch in Hexadezimalschreibweise um, also "12D687-96B43F"

    nun, Du sparst etwas Speicherplatz, dafuer hast Du dann aber auch keine user friendly ID mehr.

    Kennt jemand eine Routine oder Möglichkeit, mit PHP ein System zu nutzen, welches _alle_ Buchstaben des Alphabets sowie 0-9 verwendet? Dadurch liesse sich der Name noch weiter verkürzen und man hätte sowas wie: "8vcy3-kkz17"

    Beschaeftige Dich mit bytes & bits.

    Gruss,
    Ludger

    1. nun, Du sparst etwas Speicherplatz, dafuer hast Du dann aber auch keine user friendly ID mehr.

      Genau wegen der Reduktion habe ich eine user friendly ID. Eine Kombination aus weniger Zahlen und Buchstaben ist leichter zu merken als eine lange Zahlenfolge ohne System.

      Beschaeftige Dich mit bytes & bits.

      Ziemlich altkluger Hinweis.

      Danke, Tom

      1. Hi,

        nun, Du sparst etwas Speicherplatz, dafuer hast Du dann aber auch keine user friendly ID mehr.

        Genau wegen der Reduktion habe ich eine user friendly ID. Eine Kombination aus weniger Zahlen und Buchstaben ist leichter zu merken als eine lange Zahlenfolge ohne System.

        Zahlen sind m.E. besser zu merken als Kombinationen aus Zahlen und Buchstaben.

        Beschaeftige Dich mit bytes & bits.

        Ziemlich altkluger Hinweis.

        Nun, Du fragtest nach Codierungen, oder?

        Gruss,
        Ludger

        1. Zahlen sind m.E. besser zu merken als Kombinationen aus Zahlen und Buchstaben.

          Ja, vollkommen. Aber Buchstaben allein geht auch einfacher.

          Kaum vorzustellen, wenn Kreditkarten"nummern" oder Telefon"nummern" zukünftig auch noch Buchstaben enthielten.

          Allerdings fände ich eine rein numerische oder alphabetische Notation beim Schach etwas ungünstig ... ;-)

          Ciao, Frank

          1. Hi,

            Allerdings fände ich eine rein numerische oder alphabetische Notation beim Schach etwas ungünstig ... ;-)

            eine rein numerische Notation gibt es selbstverstaendlich bereits: "5254" (entspricht "e2e4"), die Schachprogramme kommen uebrigens mit einem Byte pro Zug aus, da es keine Stellungen gibt mit mehr als 256 verschiedenen legalen Zuegen.

            Zum Beispiel waere
               F
            moeglicherweise ein Prima-Eroeffnungszug.

            Gruss,
            Ludger

            1. Hi again,

              F

              das lässt mich grübeln ... 5254 ergibt gerade 16

              Klär mich doch bitte mal auf :-)

              die Schachprogramme kommen uebrigens mit einem Byte pro Zug aus

              Deswegen gibt es auch schon Schach auf dem Handy ;-)

              Ciao, Frank

              1. Hi,

                F

                das lässt mich grübeln ... 5254 ergibt gerade 16

                Klär mich doch bitte mal auf :-)

                ist eine Implementierungsfrage, Schachprogramme nummerieren alle moeglichen Zuege (Anzahl immer kleiner 256) irgendwie durch, Beispiel:

                a2a3 = 0
                b1a3 = 1
                a2a4 = 2
                b2b3 = 3
                b2b4 = 4
                b1c3 = 5
                c2c3 = 6
                c2c4 = 7
                d2d3 = 8
                d2d4 = 9
                e2e3 = a
                e2e4 = b
                f2f3 = c
                g1f3 = d
                f2f4 = e
                g2g3 = f
                g2g4 = 10
                g1h3 = 11
                h2h3 = 12
                h2h4 = 13

                Gruss,
                Ludger

                1. Hi Ludger,

                  ah ja, danke für Aufklärung.

                  ob g2g3 (für Weiß nehme ich mal an) jetzt wirklich eine gute Eröffnung ist, darüber weißt du sicher besser bescheid als ich. Mein Schachzenith (als Stadtmeister/Jugendolympiadesieger Dresden) liegt zu lange zurück (1988-1990) als dass ich mich da noch auskennen würde. Vielleicht sollte ich einfach wieder mal mit anfangen :-)

                  Ciao, Frank

      2. Hi,

        mal wieder ein typischer Fall davon, wie man hier falsche Antworten bekommt, wenn man das eigentlich zugrunde liegende Problem nicht beschreibt. Oder sich dessen gar nicht bewußt ist: Betriebsblindheit kennt viele Formen.

        Genau wegen der Reduktion habe ich eine user friendly ID. Eine Kombination aus weniger Zahlen und Buchstaben ist leichter zu merken als eine lange Zahlenfolge ohne System.

        Es ist also eine psychologische Frage, ein Problem der memnotischen Art, mit Subproblemen in Schrift und Sprache und gar nicht eine Frage der Datenkompression?

        Dein Problem ist also leicht merkbare User-ID -- man kann das auch Benutzernamen nennen, Herr Kollege! Vielleicht hättest Du mit der Bezeichnung ja sogar das eigentliche Problem erkannt? ;-) -- zu bilden.
        Da das je nach Schrift und Sprache verschieden ist, wäre eine Zahl natürlich die portabelste Lösung. Die einzig portable Lösung übrigens.
        Wenn Du es jedoch auf lateinische Buchstaben beschränkst und auf indogermanische Sprachen kann ich Dir sagen, das eine Kombination aus "Konsonant-Vokal-Konsonant" gut merkbar ist, auch wenn mehrere dieser Gebilde hintereinander stehen. Man kann diese Kombination nämlich aussprechen, das sind Worte; vielleicht ohne Sinn und Verstand, werden jedoch als Worte angesehen.

        Wolltest Du PHP, habe ich das richtig mitbekommen? Ich hatte mal als Beispiel einen APG (automated password generator) gebastelt, der auch aussprechbare Paßwörter ausgeben konnte, ähnlich APG.

        Folgende Funktion war mal ein Beispiel und ist ein "schneller Hack am Abend: erquickend und labend" deshalb rate ich von mehr als "Ideenklau" dringendst ab! ;-)

        /* Function buildPW() shamelessly stolen from Max Dobbie-Holman max@blueroo.net */

        /* Added some letters, ripped substr(),gave it the numbers and a quality check
           and some other stuff. Not much left of Max' work, but I feel better with
           the address :) */

        function buildPw($username) {
          /* It might be a good idea, depending on the displaying font, to remove
              either '0'(zero) or 'O'(capital 'o')  or both */

        $consts = 'AÄBCDEFGHIJKLMNOÖPQRSTUÜVWXYZaäbcdefghijklmnoöpqrsßtuüvwxyz1234567890';

        /* You'll get pronouncable passwords, if you put only vowels in $vowels and
             consonants in $consts respectivly.
             But check checkEntropy() above for some adjustments (it's commented there)*/

        $vowels = 'AÄBCDEFGHIJKLMNOÖPQRSTUÜVWXYZaäbcdefghijklmnoöpqrsßtuüvwxyz1234567890';

        $const = $vow = $pw = "";
          $ent = 0.0;

        /* not really necessary */
          $six = mixIt("012345");

        for ($x=0; $x < 6; $x++) {
            mt_srand ((double) microtime() * (1000000+$x));

        /* The value '68' is the number of chars in $consts and $vowels respectivly.
               If you change either, don't forget to change it here too. */

        $const{$x} = $consts{mt_rand(0,68)};
            $vow{$x} = $vowels{mt_rand(0,68)};
          }
          $pw = $const{$six{0}} .
                $vow{$six{0}} .
                $const{$six{1}} .
                $vow{$six{1}} .
                $const{$six{2}} .
                $vow{$six{2}} .
                $const{$six{3}} .
                $vow{$six{3}};

        /* This check reduces P(hit) by a small amount (calculation
             left as an exercise for the reader) but increments
             the distribution. Test $ent!=127.5 for optimum.
             This is at least discussable, I know ;-)
             And, worse, it may crash zend (memory exhaust) if you
             test for $ent!=127.5 (BUG #1901)*/

        $ent = checkEntropy($pw);
          if($ent < 110 || $ent > 145 ) {
            $pw = buildPw($username);
          }

        /* save password in a DB or whatever. You might also check
             if the password is in use. */

        if(savePw($username,$pw) == 0){
             return $pw;
          } else {
            $pw = '<span style="font-size:200%;color:red;">Warning!</span><br />';
            $pw = '<span style="font-size:150%;">Database Error</span><br />';
            return $pw;
          }

        return NULL;
        }

        so short

        Christoph Zurnieden

        1. Hallo Christoph!

          Wolltest Du PHP, habe ich das richtig mitbekommen? Ich hatte mal als Beispiel einen APG (automated password generator) gebastelt, der auch aussprechbare Paßwörter ausgeben konnte, ähnlich APG.

          Folgende Funktion war mal ein Beispiel und ist ein "schneller Hack am Abend: erquickend und labend" deshalb rate ich von mehr als "Ideenklau" dringendst ab! ;-)

          Och, interessant auf jeden Fall, und für den anstehenden Diebstahl emfehle ich dann PEAR::Text_Passwort:

          <?php  
          require_once 'Text/Password.php';  
            
          echo "Creating pronounceable password of 10 chars....: ";  
          echo Text_Password::create() . "\n\n";  
          ?>
          

          fertig ;-)

          Doku: http://pear.php.net/manual/en/package.text.text-password.types.php#package.text.text-password.types.pronounceable

          Grüße
          Andreas

          --
          SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
          1. Hi,

            Folgende Funktion war mal ein Beispiel und ist ein "schneller Hack am Abend: erquickend und labend" deshalb rate ich von mehr als "Ideenklau" dringendst ab! ;-)

            Och, interessant auf jeden Fall, und für den anstehenden Diebstahl emfehle ich dann PEAR::Text_Passwort:

            Ist doch immer wieder schön zu erfahren, das man nicht gänzlich unfähig ist ;-)

            Ein kleines Problem habe ich damit: die Funktion der Helferfunktionen ist mir unverständlich. Das ist doch überflüssig oder habe ich da was verpaßt? (XOR geht ja noch, weil es die Markoventropie erhöht, aber der Rest?)

            so short

            Christoph Zurnieden

            1. Hi Christoph!

              Och, interessant auf jeden Fall, und für den anstehenden Diebstahl emfehle ich dann PEAR::Text_Passwort:

              Ist doch immer wieder schön zu erfahren, das man nicht gänzlich unfähig ist ;-)

              *g*

              Ein kleines Problem habe ich damit: die Funktion der Helferfunktionen ist mir unverständlich. Das ist doch überflüssig oder habe ich da was verpaßt? (XOR geht ja noch, weil es die Markoventropie erhöht, aber der Rest?)

              Du meinst den Kram unter "Passwords based on given strings"? Ja, das finde ich auch Schwachsinnig.

              Zum Glück zwingt mich niemand das zu nutzen ;-)

              ich verwende meist sowas:

              <?php  
              require_once 'Text/Password.php';  
              echo Text_Password::create(10, 'unpronounceable','alphanumeric') . "\n";  
              ?>  
              
              

              das gibt dann z.B.: "SmEGYdEIxO"

              die "pronounceable" Variante ergibt dagegen sowas: "cloufroupa"

              Hab jetzt keine Lust das genau auszurechnen, aber ein Passwort mit 9 Stellen hat ca. 42.144.192 verschiedene Möglichkeiten ((29*12)^3, hab mal angenommen dass bei jedem Schleifendurchaluf im Schnitt 3 Zeichen erstellt werden)

              Die "unpronounceable" Variante ist natürlich deutlich besser, aber eben schlechter zu merken.

              Hierbei gibt es 13.537.086.546.263.552 (62^9) Möglichkeiten, also ca. 300 Mio. mal soviele ;-)

              Viele Grüße
              Anreas

              --
              SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
  2. Versuchs hiermit:

      
    function to_26($zahl) {  
      $chars = Array(  
        0,1,2,3,4,5,6,7,8,9,  
        'A','B','C','D','E',  
        'F','G','H','I','J',  
        'K','L','M','N','O',  
        'P','Q','R','S','T',  
        'U','V','W','X','Y','Z'  
      );  
      
      $a = 1;  
      
      while($zahl >= $a) {  
        $a *= 26;  
      }  
      
      while($a != 1) {  
        $a    /= 26;  
      
        $b     = $zahl / $a;  
        $zahl %= $a;  
      
        $result .= $chars[$b];  
      }  
      
      return $result;  
    }  
    
    
    1. Hi,

      eventuell empfiehlt sich auch eine Base64-Codierung, wenns noch "komprimierter" sein soll.

      Gruss,
      Ludger

    2. Hallo Anonymous,

      danke für Deine Funktion. Habe sie nicht getestet, weil die integrierte Variante bereits super läuft, aber sie ist sehr lehrreich für mich.

      Tom

    3. Hi,

      ich komme beim Zählen auf 36 (10 Ziffern + 26 Buchstaben) aber vielleicht hab ich ja auch nur n Klecks auffer Brille :-)

      Gruß, Frank

      1. ich komme beim Zählen auf 36 (10 Ziffern + 26 Buchstaben) aber vielleicht hab ich ja auch nur n Klecks auffer Brille :-)

        Ne, du hast recht. Ich habe mich verzählt.

      2. Hallo Frank,

        das ist wahrscheinlich auch der Grund, warum in Javascript bei der folgenden Methode des Number-Objektes:

        http://de.selfhtml.org/javascript/objekte/number.htm#to_string

        der optionale Parameter Werte zwischen 2 und 36 annehmen kann.

        Gruß Gernot

        1. Hi Gernot,

          mann lernt nie aus. Danke für den Tip. :)

          Ciao, Frank

  3. Hi there,

    Kennt jemand eine Routine oder Möglichkeit, mit PHP ein System zu nutzen, welches _alle_ Buchstaben des Alphabets sowie 0-9 verwendet?

    Du kannst die Funktion von anonymous verwenden oder aber die in php-implementierte Version base_convert

    base_convert wandelt beliebige Zahlensystem in beliebige Zahlensysteme um. Die Syntax ist

    base_convert ( string number, int frombase, int tobase)

    und zurück wird ein String gegeben, der Deiner umgewandelten Zahl entspricht...

    1. base_convert ( string number, int frombase, int tobase)

      Vielen Dank! Deine Antwort war sehr hilfreich, das hat mir geholfen.
      Tom

  4. Hey,

    Kennt jemand eine Routine oder Möglichkeit, mit PHP ein System zu nutzen, welches _alle_ Buchstaben des Alphabets sowie 0-9 verwendet? Dadurch liesse sich der Name noch weiter verkürzen und man hätte sowas wie: "8vcy3-kkz17"

    Was du suchst, ist base64_encode() oder base32_encode(). Bin mir gerade
    nicht sicher, ob letztere in PHP5.0 schon dabei war, aber du kannst ja
    auch diese Erweiterung verwenden:
    http://freshmeat.net/p/upgradephp

    G,
    milky