automatisiertes erzeugen von eindeutigen strings

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

  • automatisiertes erzeugen von eindeutigen strings

    hallo zusammen,

    ich wuerde gerne mit mysql eine art oeffentlicher id eines datensatzes erzeugen, welche ein exakt 10 zeichen langer string aus a-zA-Z0-9 sein soll und innerhalb der jeweiligen tabelle eindeutig sein muss.

    hat jemand irgendwelche ideen?
    danke!
    1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

    /(bb|[^b]{2})/

  • #2
    wozu?

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Mit nur 10 Zeichen sind aber die Möglichkeiten ziemlich begrenzt. Wenns auch 32 sein dürfen, dann schau dir mal md5() an...

      Gruss

      tobi
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        Original geschrieben von Kropff
        wozu?
        um ein automatisiertes abgrasen der datensaetze anhand fortlaufender id's zu verhinden.

        Original geschrieben von jahlives
        Mit nur 10 Zeichen sind aber die Möglichkeiten ziemlich begrenzt.
        26 kleinbuchstaben plus 26 grossbuchstaben plus 10 zahlen sind bei mir 62^10 = 839.299.365.868.340.224 moeglichkeiten... ob das reichen wird?

        md5, sha oder aehnliches sind fuer diesen zweck leider zu lang. zudem ist mir leider nicht bekannt, wie ich die datenbank dazu anweise einen string zu erzeugen, der nicht schon fuer diesen schluessel existiert.
        Zuletzt geändert von loci; 09.03.2007, 12:09.
        1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

        /(bb|[^b]{2})/

        Kommentar


        • #5
          ist bestimmt ziemlich performant wenn man einen Datensatz mit der id = s34l5j345kj678g78vnb4hg465hgf4 sucht

          ne aber mal im ernst du kannst das Abgrasen doch selbst verhindern indem du einfach die parameter in der Url verschlüsselst und beim Zugriff auf die Datenabnk wieder entschlüsselst.
          siehe: Base64
          Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
          - ...und solche Behauptungen in "falsches Resourcenmanagement"

          Kommentar


          • #6
            26 kleinbuchstaben plus 26 grossbuchstaben plus 10 zahlen sind bei mir 62^10 = 839.299.365.868.340.224 moeglichkeiten... ob das reichen wird?
            Habe zu wenig genau gelesen, irgendwie dachte ich du wolltest es auch bei Dateien anwenden
            wie ich die datenbank dazu anweise einen string zu erzeugen, der nicht schon fuer diesen schluessel existiert.
            Das würde ich php machen lassen. Wenn die Spalte in der DB als UNIQUE definiert ist, dann stellt die DB sicher dass keiner zweimal vorkommt. php versucht einfach solange eine entsprechende ID zu finden bis der MySql Server keinen Fehler mehr zurück gibt
            @Zerni
            Nur eine Codierung, keine Verschlüsselung
            Bezüglich der Performance gebe ich dir Recht. Einen Integer hat mysql definitiv schneller gefunden...

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Ich benutze hier dafür uniqid(), die ich allerdings in PHP erzeuge - tut seinen Zweck hundertprozentig.
              Nen Index über die Spalte und mySQL ist nahezu so schnell wie beim finden eines integers.

              Es sei angemerkt das ich für interne Verarbeitung natürlich weiter die ID benutze, aber für einzelne "extern" Aufrufe die UniqID.

              Kommentar


              • #8
                Original geschrieben von prego
                Ich benutze hier dafür uniqid(), die ich allerdings in PHP erzeuge - tut seinen Zweck hundertprozentig.
                Nen Index über die Spalte und mySQL ist nahezu so schnell wie beim finden eines integers.
                performance issues mal ganz ausser acht. dafuer gibt's caches etc...

                wie testest du, ob die via php erzeugte id einmalig ist?
                lock table, select und einfuegen?
                oder hoffst du einfach, dass der absolut unwahrscheinlich fall nicht eintritt diesen string in den paar ms scriptlaufzeit nochmal zu finden?
                1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

                /(bb|[^b]{2})/

                Kommentar


                • #9
                  delete
                  1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

                  /(bb|[^b]{2})/

                  Kommentar


                  • #10
                    Original geschrieben von jahlives
                    @Zerni
                    Nur eine Codierung, keine Verschlüsselung
                    Bezüglich der Performance gebe ich dir Recht. Einen Integer hat mysql definitiv schneller gefunden...

                    Gruss

                    tobi [/B]
                    er will verhindern, dass die Leute einfach die Parameter ändern und dadurch auf seiner Webseite rumschnüffeln, also kann man es genauso gut mit base64 also Verschlüsselung lösen
                    Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
                    - ...und solche Behauptungen in "falsches Resourcenmanagement"

                    Kommentar


                    • #11
                      Original geschrieben von zerni
                      er will verhindern, dass die Leute einfach die Parameter ändern und dadurch auf seiner Webseite rumschnüffeln, also kann man es genauso gut mit base64 also Verschlüsselung lösen
                      Begreifen: Base64 ist keine Verschlüsselung, sondern eine Kodierung. (Du zitierst es doch sogar selber noch ...)


                      Also kannst du gerne nummerische IDs mit Base64 kodieren - aber das bekommt man ganz fix raus, und dann kann man ID+1 im Nu wieder selber Kodieren und als Parameter ans Script übergeben.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Da uniqid() einne zeitbasierten Wert zurück gibt, kann es schlichtweg nicht vorkommen das dieser Wert doppelt ist...

                        uniqid() gibt eine eindeutige ID mit Präfix zurück. Diese basiert auf der aktuellen Zeit in Mikrosekunden. Das Präfix kann hilfreich sein, wenn sie z. B. auf mehreren Servern gleichzeitig ID´s erzeugen, was ja im ungünstigsten Fall zur selben Mikrosekunde geschehen kann. Der prefix-Parameter kann bis zu 114 Zeichen lang sein.
                        siehe auch: http://de2.php.net/manual/de/function.uniqid.php


                        EDIT:
                        noch dazu kommt, das ich die uniqid einmalig beim anmelden erzeuge. Wenn du unbedingt willst, pack halt noch nen random präfix davor. Damit sollten wirklich alle Möglichkeiten für eine doppelte erzeugung ausgeschlossen sein.

                        Kommentar


                        • #13
                          multithreaded webserver oder eine fastcgi farm...
                          da sollte es definitiv moeglich sein zur gleichen mikrosekunden die id zu bilden, wenn auch relativ unrealistisch.

                          moeglich waere es hier natuerlich noch die session id zu verbasteln, da es dann wirklich quasi unmoeglich ist mit der gleichen session zur gleichen mikrosekunde einen aufruf zu taetigen.
                          das problem hierbei ist jedoch, dass mit prefix ein 32-stelliger string erzeugt wird, welcher nicht mehr mit akzeptablem aufwand von einem mensch eingegeben werden kann.
                          Zuletzt geändert von loci; 09.03.2007, 15:21.
                          1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

                          /(bb|[^b]{2})/

                          Kommentar

                          Lädt...
                          X