Re: Frage zu stored procedures

From: Peter Wullinger <some-mail-drop(at)gmx(dot)net>
To: Marcel Boscher <mboscher(at)emedia-office(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Frage zu stored procedures
Date: 2004-08-09 10:50:51
Message-ID: 20040809105051.GA1636@peter.home.wul
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

In epistula a Marcel Boscher, die horaque Mon, Aug 09, 2004 at 11:23:00AM +0200:
> Hallo Leute,
>

Tag, Marcel,

>
> [snip]
>
> Erstellen eines 4 stelligen alpha-numerischen Codes
> zufällig generiert mit einer Abfrage auf die DB ob dieser
> Code bereits existiert .... wenn ja dann neuen Code
> generierern. Bei nein Rückgabe an mein PHP Proggy
>
> 1. ist sowas möglich?

Ja, aber problematisch:

Gehen wir mal davon aus, dein Zufallsgenerator (rand()/random()) wäre
mathematisch von geringer Qualität und würde eine Zahlensequenz liefern,
die eine sehr kurze Periode aufweist.

Als Beispiel nehme ich jetzt einfach mal der Periode vier, dann bekommst
du vielleicht folgende Codes:

- 3dad
- d345
- 3ds4
- 834f

Danach hängt sich dein Algorithmus in einer Endlosschleife auf.

Vier Stellen sind imho zu wenig, die Kollisionswahrscheinlichkeit ist da
recht hoch. Fall ich wirklich eine eindeutige ID brauche, gibt
Uhrzeit + Datum + Zufallszahl und das Ganze durch MD5 recht brauchbare
Werte.

> und
> 2. kann mir jemand einen Ansatz oder nen Lösungsweg aufzeigen

Für Zahlen von 0 bis 10000 in PL/pgSQL:

DROP TABLE number_history;
CREATE TABLE number_history (
entry INTEGER PRIMARY KEY
);

DROP FUNCTION generate_number();
CREATE FUNCTION generate_number() RETURNS INTEGER AS '
DECLARE
nentries INTEGER;
key INTEGER;
BEGIN
nentries := 1;
WHILE (nentries > 0) LOOP
key := trunc(random() * 10000);
SELECT
INTO nentries
count(*)
FROM number_history
WHERE number_history.entry = key;
END LOOP;

INSERT
INTO number_history (entry)
VALUES (key);

RETURN(key);
END;
' LANGUAGE 'plpgsql';

Und dann zum Erzeugen der Zufallszahl:

SELECT generate_number();

Geht natürlich ähnlich auch in PL/C, PL/Perl und PL/Python.

Mit ein paar Tricks kann man auch den Tabellennamen als Parameter
übergeben.

Gruß,
Peter

--
BSD is what you get when a bunch of Unix hackers sit down to try to port
a Unix system to the PC.
Linux is what you get when a bunch of PC hackers sit down and try to write
a Unix system for the PC.

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Tobias Weidelt 2004-08-13 22:51:07 Re: Frage zu stored procedures
Previous Message Marcel Boscher 2004-08-09 09:23:00 Frage zu stored procedures