Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
OT: Zufälligen SQL-Wert generieren?
#1
Hi Leute, vielleicht kann mir jemand helfen:

ich möchte einen laufenden, zufälligen SQL-Wert generieren, welcher aus den Zahlen 0-9 und den Buchstaben A-Z bestehen darf.
Dieser Wert soll max. 4 Stellen haben.
Welche Funktion steht mir zur Verfügung, mit uniqid() kann ich die maximalen stellen nicht beschränken?!

LG und danke inzwischen,
Nikee
Zitieren
#2
Und wenn du einfach mehrere Variablen mit einer länge von 1 Zeichen anlegen würdest?
Beispiel:
Du hast dann 4 Variablen
Var1 (Beinhaltet das zufallsgenerierte Zeichen und ist nur ein zeichen lang)
Var2 - Var4 = (Genauso wie Var1)

Dann hast noch eine 5. Variable
Gesamt_Var = (Clipst ganz einfach Var - Var4 zusammen)

--------------------

Das ist zwar umständlich aber dürfte Funktionieren habe sql aber noch nie gemacht.
Wenn das sinnlos war bitte net schimpfen. [Bild: icon_sad.gif]
Zitieren
#3
naja dann tus in a variable (egal wieviel stellen) und die kürzt halt auf die stellenanzahl, wenn die anzahl drunter is, neuen wert generieren.
sollt doch gehn oda?
Zitieren
#4
Oder so.
Ich denke immer Kompliziert.
Man kann aber auch die variable auf nur 4 stellen deklarieren, oder?
Und dann einfach da reinschreiben den generiertren wert.
passen eh net mehr als 4 rein. [Bild: grin.gif]

Man keine Ahnung. Das sagt mir das i sql auch anfangen muss *gg*
Zitieren
#5
welches DBMS?

leider sind die Random-Funktionen der DBMSs relativ schlecht. Rainer hatte mit dem SQL-Server da auch nicht so gute Erfahrungen gemacht. Beim alten MySQL hat das auch ziemlich gesponnen. Beim 4er sollte es angeblich besser sein.

Grundsätzlich hat ja SQL keine Random-Funktion. Das sind alles proprietäre Erweiterungen des DBMS.

Ihr verwendet vermutlich Oracle, oder? Oder a SAP-DBMS? Kenn mich da net so aus.

Wenn's irgendwie geht, mach's eher im Programmcode und nicht auf der DB - ist jedenfalls einfacher.

Ausserdem ist "laufenden, zufälligen SQL-Wert" net grad sehr verständlich. Sorry, dass ich jetzt obergscheit klinge, aber entweder er ist fortlaufend - also ein Zähler, oder er ist zufällig. Wenn er eindeutig sein soll, dann kann er nicht zufällig sein. Und was meinst du mit "SQL-Wert". Das ganze soll in der DB-Ablaufen? Stored Procedure oder SELECT-Statement, oder?

sonst sowas wie:
<pre>
initialisiere Zufallszahlengenerator;
str = "";
for(i = 0; i < 4 i++)
{
j = rnd(36); // erzeugt Zufallszahlen von 0 bis 35
if(j < 10)
str = str + chr(j + 48);
else
str = str + chr(j - 10 + 65)
}
</pre>
muss man natürlich an die jeweilege Prog-Sprache anpassen.

was auch gehen würde: Zufallszahl generieren (möglichst großer Bereich, dann einen hash davon berechnen (md5-Funktion z.B.) und davon dann die ersten 4 Ziffern verwenden:

in PHP z.B.:
str = substr(md5(rand()), 0, 4);

Kommt halt auf die Eigenschaften an, die der Code haben soll.

Wenn du das ganze in einem Select/Insert/Update brauchst, dann geht vermutlich keine Schleife - einfach 4 mal hintereinander denselben Code. Eventuell ohne If und dafür vorher einen String definieren:
z.B. für SQL-Server (ohne es getestet zu haben.)

<pre>
DECLARE strChars VARCHAR(255)
SET strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SELECT SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1) +
SUBSTRING(strChars, ROUND(36 * RAND()), 1)
</pre>

geht natürlich auch in am Insert oder Update.
Achtung: Randbedingungen beim SUBSTRING und ROUND hab ich nicht gecheckt.


Nachtrag: Ich glaub das mit den Problemen bei Zufallszahlen und den DBMS ist bei deinem Fall kein Problem. Bei uns war das jeweils das Problem, dass wir zufällig Zeilen aus einer Tabelle auswählen wollten. D.h. man muss beim ORDER BY eine Zufallszahl verwenden. Und da haben/hatten die DBMS Probleme. Sprich die Zeilen die da rausgekommen sind, waren meist überhaupt nicht zufällig. Hatte das Problem z.B. bei der Fußzeile hier im Forum: Wollte, dass unter "Besucht auch unsere Sponsoren:" unsere größten Sponsoren zufällig sortiert erscheinen. Gewichtet nach dem was sie zahlen.

Aufpassen musst natürlich bei den Initialisierungswerten der Zufallszahlengeneratoren. Ist aber auch immer ein Implementierungsdetail, also net unbedingt allgemeingültig.
Zitieren
#6
Zitat: was auch gehen würde: Zufallszahl generieren (möglichst großer Bereich, dann einen hash davon berechnen (md5-Funktion z.B.) und davon dann die ersten 4 Ziffern verwenden:

in PHP z.B.:
str = substr(md5(rand()), 0, 4);


was soll das bringen? damit sind die zahlen ja nicht mehr zufällig...du hast keine normalverteilung mehr...

Übrigens: Es ist mitunter nicht sinnvoll in einem SQL Statement eine etwaige RAND() Funktion (wie etwa bei MySQL) zu verwenden, da die funktion bei etwa :

<pre> SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() </pre>

in jedem durchgang der where clause neu ausgewertet wird.
Kann jedoch von DBMS zu DBMS verschieden sein. Dies muss man im Manual nachlesen. [Bild: icon_wink.gif]
Zitieren
#7
zufällig sind sie noch immer. (außer du definierst zufällig als normalerverteilt)
ob sie noch normalverteilt sind, kann ich so allerdings nicht sagen. Hängt vom Hash-Algorithmus ab, denke ich.

Jedenfalls wird diese Vorgehensweise beim Generieren von Session-IDs normalerweise verwendet. Allerdings halt nicht auf 4 Zeichen beschränkt. Und da geht's ja auch darum einen möglichst zufälligen String zu erzeugen, der möglichst nicht erraten werden kann.
Zitieren
#8
ich meinte ja nur: warum eine zufällige zahl noch zufälliger machen probieren? [Bild: icon_lol.gif]
ausserdem ist es eine verschwendung von processor-cycles.

ob sie dann noch normalverteilt sind?....wäre in der tat interessant, aber ich denke mal NEIN (Siehe RFC irgendwo im netz...demnach würd ich eher sagen nein, da ja zwei strings den gleichen digest haben können...wenn auch sehr unwahrscheinlich)

ausserdem wenn du einen hash beschneidest ist die ganze einzigartigkeit beim teufel...das sollte man auf keinen fall tun.

Zugegebener massen - man müsste glaub ich ein Mathematiker sein, um die meisten hier aufgetretenen Fragen zu beantworten [Bild: mrred.gif]
Zitieren
#9
hier liegt eine leichte "Fehlinterpretation" vor [Bild: wink.gif]
die meisten Zufalszahlengenaratoren, welche in
Programmiersprachen zur Verfügung stehen erzeugen
gleichverteilte Pseudozufallszahlen, da Gleichverteilung
mit Abstand am einfachsten zu implementieren ist.

Wenn du jetzt Normalverteilung, F-Verteilung,
Poisson-Verteilung oder Student T-Verteilung erreichen
möchtest mußte du sie erst aus mehreren gleichverteilten
Werten erzeugen... (sie haben uns auf der TU ein ganzes
Semester damit belästigt... da braucht es ordentlich
Bier... [Bild: icon_twisted.gif] ) Am besten sind diese Dinge in den
Algorithmenbüchern von Knuth nachzulesen.


Wenn es ein MS SQL Server ist könnte man ja auch eine VB
Bibliothek aufrufen. Es gibt für diese "verwachsene" Sprache
Zufallszahlengeneratoren für beinahe jede Verteilung.
für so ziemlich
Zitieren
#10
danke für die aufklärung. ich hab auch grad über die pseudorandomnumbergenerators (geiles langes wort [Bild: smile.gif] ) gelesen.
Zitieren
#11
>ich meinte ja nur: warum eine zufällige zahl noch
>zufälliger machen probieren?
na, es ging nur darum, dass eben auch Buchstaben verwendet werden - nicht nur zahlen. Bei einer 4-stelligen Zahl gibt es 10.000 Möglichkeiten (10^4) Bei Buchstaben und Zahlen gibt es (10 + 26)^4 Möglichkeiten => 1,6 Mio Möglichkeiten. Dafür bräuchte man schon eine 7-stellige Zahl.

>ausserdem ist es eine verschwendung von processor-cycles.
stimmt. Das ich sowas vorschlage - so kenne ich mich gar net. In der Firma lachen sie mich immer aus, wenn ich ihnen vorrechne, was von den Tacktzyklen her schneller ist. Aber man muss halt wissen, wo es wichtig ist zu optimieren. Wenn ich alle paar Minuten mal 100.000 Taktzyklen verschwenden ist ziemlich egal (bei 2 Mrd. Taktzyklen pro Sekunde). Aber wenn ich mir irgendwo immer wieder 100 Taktzyklen sparen kann...

>ob sie dann noch normalverteilt sind?....
>wäre in der tat interessant, aber ich denke
> mal NEIN (Siehe RFC irgendwo im netz...demnach würd
> ich eher sagen nein, da ja zwei strings den gleichen digest haben
>können...wenn auch sehr unwahrscheinlich)

Da hast du recht. Klarerweise können zwei Eingangswerte denselben Hash-Wert erhalten (Eingang ist ja beliebig groß, Ausgang nur begrenzt).

>ausserdem wenn du einen hash beschneidest ist
>die ganze einzigartigkeit beim teufel...
>das sollte man auf keinen fall tun.

- Hash ist nie einzigartig
- Gesucht ist eine Zufallszahl, die ist auch nie einzigartig.

>Zugegebener massen - man müsste glaub ich ein Mathematiker sein, um die
>meisten hier aufgetretenen Fragen zu beantworten

ich würde das bestenfalls empirisch testen. Programm schreiben, dass das einfach macht und dann schauen, wie die Codes verteilt sind.

Mathematisch wäre das ziemlcih zach, weil so Hash-Algorithmen schon ziemlich zach sind. Ich bin schon ziemlcih ausgestiegen, als ich im Zuge meiner Diplomarbeit mich mit dem MD5 beschäftigt habe, und einen Artikel gefunden habe, wo stand, dass MD5 nicht mehr uneingeschränkt kollissionsfrei ist. Dh. unter bestimmten Umständen ist es möglich zu einem bestimmten Eingangswert mit einem entsprechenden Hash-Wert einen anderen Eingangswert zu finden, der auch denselben Hash-Wert ergibt. Unter welchen Umständen habe ich allerdings nicht gecheckt. Jedenfalls empfehlen, die dass man stattdessen SHA-1 verwenden soll.
Zitieren
#12
Zitat: ob sie dann noch normalverteilt sind?....wäre in der
tat interessant, aber ich denke mal NEIN (Siehe RFC irgendwo
im netz...demnach würd ich eher sagen nein, da ja zwei strings
den gleichen digest haben können...wenn auch sehr unwahrscheinlich)


ich würde dir empfehlen den Begriff Verteilung noch einmal
nachzuschlagen! [Bild: icon_twisted.gif]

du verwechselst in deinem Statement eine Folge von
einzigartigen, niemals wiederholten Werten mit einer Folge
von Zufallswerten. Normalverteilt heißt für eine Folge von
Zufallswerten (sehr stark vereinfacht) ja nichts andere, als
dass die Häufigkeit, mit welcher einzelne Werte in der Folge
vorkommen, unter einer Gaußschen Glockenkurve liegen.

Siehe zum Beispiel normalverteilung in vb

oder
zufallszahlenerzeugung

Zitieren
#13
>SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND()
>in jedem durchgang der where clause neu ausgewertet wird.

was hier mit ausgewertet gemeint ist, weiß ich net genau.
Die Zufallszahl muss bei jeder Zeile neu generiert werden, sonst haut das ja net hin.

Ich hätte es ja intuitive so geschrieben:

SELECT *, RAND() AS randomValue FROM table ORDER BY randomValue

aber wenn ich mich richtig erinnere, hatte das in MySQL net hingehauen. Ich glaube sogar, dass die von dir zitierte Zeile oben im MySQL Handbuch so drinnen steht.

Aber vielleicht wäre es sowieso besser es so zu machen (ist mir jetzt gerade eingefallen):

Auf Datenbank: SELECT COUNT(1) FROM table
Dann eine Zufallszahl zwischen 0 und der zurückgegebenen Anzahl erzeugen
dann wieder auf der DB: SELECT * FROM table LIMIT <Zufallszahl>, 1

geht aber nur mit MySQL. SQL-Server hat kein LIMIT , nur ein TOP. Bei Oracle weiß ich es nicht mehr. Allerdings sind dann 2 Datenbank-Roundtrips notwendig. MySQL hat ja keine Stored Procs. Aber ich brauch halt nur eine Zufallszahl erzeugen. Bei ganz großen Datenmengen könnte es aber schneller sein. Müsste man testen.
Zitieren
#14
Gute Infos zu Hash-Funktionen gibt es zum Beispiel im
"Handbook of Applied Cryptography"

Du findest da Kapitel unter
Hash-Algorithmen
Zitieren
#15
Uups. mir sind die Begriffe nimmer so geläufig. Ich hab halt an eine Verteilung gedacht, wo alle Werte gleich häufig vorkommen. Normalverteilung = Gaußverteilung und net Gleichverteilung.
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Ist das Telefon den Kauf wert? eminemhzx 0 58 2012-09-17, 10:01
Letzter Beitrag: eminemhzx
  Was íst ein Gary Fisher Tassajara '99 noch Wert? Groovy 3 3,080 2007-05-05, 15:19
Letzter Beitrag: Dr. Dollar
  Was ist euch das Leben wert ??? Haiflyer 74 12,195 2004-09-18, 18:21
Letzter Beitrag: Nikee
  OT: was isser noch wert ? Haiflyer 8 952 2003-10-26, 18:41
Letzter Beitrag: Haiflyer
  Wieviel sind mir Hochwasseropfer wert ? freakazoid 15 1,748 2002-08-12, 21:03
Letzter Beitrag: freakazoid

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste