4
** The author disclaims copyright to this source code. In place of
5
** a legal notice, here is a blessing:
7
** May you do good and not evil.
8
** May you find forgiveness for yourself and forgive others.
9
** May you share freely, never taking more than you give.
11
*************************************************************************
12
** This file contains code to implement a pseudo-random number
13
** generator (PRNG) for SQLite.
15
** Random numbers are used by some of the database backends in order
16
** to generate random integer keys for tables or random filenames.
18
** $Id: random.c,v 1.12 2004/05/08 08:23:32 danielk1977 Exp $
20
#include "sqliteInt.h"
25
** Get a single 8-bit random value from the RC4 PRNG. The Mutex
26
** must be held while executing this routine.
28
** Why not just use a library random generator like lrand48() for this?
29
** Because the OP_NewRecno opcode in the VDBE depends on having a very
30
** good source of random numbers. The lrand48() library function may
31
** well be good enough. But maybe not. Or maybe lrand48() has some
32
** subtle problems on some systems that could cause problems. It is hard
33
** to know. To minimize the risk of problems due to bad lrand48()
34
** implementations, SQLite uses this random number generator based
35
** on RC4, which we know works very well.
37
static int randomByte(){
40
/* All threads share a single random number generator.
41
** This structure is the current state of the generator.
44
unsigned char isInit; /* True if initialized */
45
unsigned char i, j; /* State variables */
46
unsigned char s[256]; /* State variables */
49
/* Initialize the state of the random number generator once,
50
** the first time this routine is called. The seed value does
51
** not need to contain a lot of randomness since we are not
52
** trying to do secure encryption or anything like that...
54
** Nothing in this file or anywhere else in SQLite does any kind of
55
** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random
56
** number generator) not as an encryption device.
63
sqlite3OsRandomSeed(k);
68
prng.j += prng.s[i] + k[i];
70
prng.s[prng.j] = prng.s[i];
76
/* Generate and return single random byte
81
prng.s[prng.i] = prng.s[prng.j];
88
** Return N random bytes.
90
void sqlite3Randomness(int N, void *pBuf){
91
unsigned char *zBuf = pBuf;
92
sqlite3OsEnterMutex();
94
*(zBuf++) = randomByte();
96
sqlite3OsLeaveMutex();