Bonjour,

Je dois pouvoir générer des ID de session aléatoires dans une procédure stockée, sous la forme de chaînes de 16 chiffres hexadécimaux.

Pour ça, j'ai codé la procédure stockée suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE PROCEDURE RandomString (
  ValidChars VARCHAR(255) CHARACTER SET ASCII,
  StrLength INTEGER
)
RETURNS (
  RandStr VARCHAR(255) CHARACTER SET ASCII
)
AS
 
DECLARE VARIABLE Len SMALLINT;
DECLARE VARIABLE RandInt SMALLINT;
BEGIN
  RandStr = '';
  Len = StrLen(ValidChars);
 
  WHILE (StrLength > 0) DO
  BEGIN
    RandInt = Floor(Len*Rand()) + 1;
    IF (RandInt <= StrLength) THEN -- avoiding Rand returning 1
    BEGIN
      RandStr = RandStr || SubStr(ValidChars, RandInt, RandInt);
      StrLength = StrLength - 1;
    END
  END
 
  SUSPEND;
END
Le problème, c'est que les appels répétés à Rand() en peu de temps donnent le même résultat plusieurs fois de suite. J'obtiens des chaînes comme :
Code X : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
5555555555522200
CCCC999555533000
9999999776333210
Bref pas très aléatoire

En cosultant ib_udf2.sql, on trouve :
Note: The rand() function was changed in Firebird 2.0 so that the seed value is not set by every call. This corrects a potential duplicate value problem and ensures that different values will always be returned.

To seed the random number generator or retain the old behaviour, use srand().
Mais mon hébergeur travaille sous Firebird 1.5, et ne m'autorise pas l'utilisation de mes propres UDFs.

Y a-t-il un moyen d'éviter ces répétitions ? Forcer des pertes de temps entre deux appels ?

d'avance