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 :
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 : 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
Bref pas très aléatoire
Code X : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 5555555555522200 CCCC999555533000 9999999776333210
En cosultant ib_udf2.sql, on trouve :
Mais mon hébergeur travaille sous Firebird 1.5, et ne m'autorise pas l'utilisation de mes propres UDFs.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().
Y a-t-il un moyen d'éviter ces répétitions ? Forcer des pertes de temps entre deux appels ?
d'avance
Partager