/ Hex Artifact Content
Login

Artifact b6a57e85288470b013ad584a8813e893b60e62fe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
01a0: 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   pseudo-random n
01b0: 75 6d 62 65 72 0a 2a 2a 20 67 65 6e 65 72 61 74  umber.** generat
01c0: 6f 72 20 28 50 52 4e 47 29 20 66 6f 72 20 53 51  or (PRNG) for SQ
01d0: 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 61 6e 64  Lite..**.** Rand
01e0: 6f 6d 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75  om numbers are u
01f0: 73 65 64 20 62 79 20 73 6f 6d 65 20 6f 66 20 74  sed by some of t
0200: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
0210: 65 6e 64 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ends in order.**
0220: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 72 61 6e   to generate ran
0230: 64 6f 6d 20 69 6e 74 65 67 65 72 20 6b 65 79 73  dom integer keys
0240: 20 66 6f 72 20 74 61 62 6c 65 73 20 6f 72 20 72   for tables or r
0250: 61 6e 64 6f 6d 20 66 69 6c 65 6e 61 6d 65 73 2e  andom filenames.
0260: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 72 61 6e 64  .**.** $Id: rand
0270: 6f 6d 2e 63 2c 76 20 31 2e 36 20 32 30 30 31 2f  om.c,v 1.6 2001/
0280: 30 39 2f 31 39 20 31 33 3a 32 32 3a 34 30 20 64  09/19 13:22:40 d
0290: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
02a0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
02b0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  h".#include "os.
02c0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  h"../*.** Get a 
02d0: 73 69 6e 67 6c 65 20 38 2d 62 69 74 20 72 61 6e  single 8-bit ran
02e0: 64 6f 6d 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  dom value from t
02f0: 68 65 20 52 43 34 20 50 52 4e 47 2e 0a 2a 2f 0a  he RC4 PRNG..*/.
0300: 69 6e 74 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  int sqliteRandom
0310: 42 79 74 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  Byte(void){.  in
0320: 74 20 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  t t;..  /*.  ** 
0330: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
0340: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68  ructure holds th
0350: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
0360: 6f 66 20 74 68 65 20 52 43 34 20 61 6c 67 6f 72  of the RC4 algor
0370: 69 74 68 6d 2e 0a 20 20 2a 2a 20 57 65 20 75 73  ithm..  ** We us
0380: 65 20 52 43 34 20 61 73 20 61 20 72 61 6e 64 6f  e RC4 as a rando
0390: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
03a0: 6f 72 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  or.  Each call t
03b0: 6f 20 52 43 34 20 67 69 76 65 73 0a 20 20 2a 2a  o RC4 gives.  **
03c0: 20 61 20 72 61 6e 64 6f 6d 20 38 2d 62 69 74 20   a random 8-bit 
03d0: 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  number..  **.  *
03e0: 2a 20 4e 6f 74 68 69 6e 67 20 69 6e 20 74 68 69  * Nothing in thi
03f0: 73 20 66 69 6c 65 20 6f 72 20 61 6e 79 77 68 65  s file or anywhe
0400: 72 65 20 65 6c 73 65 20 69 6e 20 53 51 4c 69 74  re else in SQLit
0410: 65 20 64 6f 65 73 20 61 6e 79 20 6b 69 6e 64 20  e does any kind 
0420: 6f 66 0a 20 20 2a 2a 20 65 6e 63 72 79 70 74 69  of.  ** encrypti
0430: 6f 6e 2e 20 20 54 68 65 20 52 43 34 20 61 6c 67  on.  The RC4 alg
0440: 6f 72 69 74 68 6d 20 69 73 20 62 65 69 6e 67 20  orithm is being 
0450: 75 73 65 64 20 61 73 20 61 20 50 52 4e 47 20 28  used as a PRNG (
0460: 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 0a 20 20  pseudo-random.  
0470: 2a 2a 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  ** number genera
0480: 74 6f 72 29 20 6e 6f 74 20 61 73 20 61 6e 20 65  tor) not as an e
0490: 6e 63 72 79 70 74 69 6f 6e 20 64 65 76 69 63 65  ncryption device
04a0: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
04b0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
04c0: 20 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74   isInit;.    int
04d0: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 73   i, j;.    int s
04e0: 5b 32 35 36 5d 3b 0a 20 20 7d 20 70 72 6e 67 5f  [256];.  } prng_
04f0: 73 74 61 74 65 3b 0a 20 0a 20 20 2f 2a 20 49 6e  state;. .  /* In
0500: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 61  itialize the sta
0510: 74 65 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  te of the random
0520: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
0530: 72 20 6f 6e 63 65 2c 0a 20 20 2a 2a 20 74 68 65  r once,.  ** the
0540: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
0550: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0560: 65 64 2e 20 20 54 68 65 20 73 65 65 64 20 76 61  ed.  The seed va
0570: 6c 75 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f  lue does.  ** no
0580: 74 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  t need to contai
0590: 6e 20 61 20 6c 6f 74 20 6f 66 20 72 61 6e 64 6f  n a lot of rando
05a0: 6d 6e 65 73 73 20 73 69 6e 63 65 20 77 65 20 61  mness since we a
05b0: 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 69  re not.  ** tryi
05c0: 6e 67 20 74 6f 20 64 6f 20 73 65 63 75 72 65 20  ng to do secure 
05d0: 65 6e 63 72 79 70 74 69 6f 6e 20 6f 72 20 61 6e  encryption or an
05e0: 79 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 61 74  ything like that
05f0: 2e 2e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ....  */.  if( !
0600: 70 72 6e 67 5f 73 74 61 74 65 2e 69 73 49 6e 69  prng_state.isIni
0610: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
0620: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
0630: 73 65 65 64 5b 5d 20 3d 20 22 20 20 20 20 73 71  seed[] = "    sq
0640: 6c 69 74 65 20 72 61 6e 64 6f 6d 20 73 65 65 64  lite random seed
0650: 20 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f   abcdefghijklmno
0660: 70 22 3b 0a 20 20 20 20 63 68 61 72 20 6b 5b 32  p";.    char k[2
0670: 35 36 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  56];.    sqliteO
0680: 73 52 61 6e 64 6f 6d 53 65 65 64 28 73 65 65 64  sRandomSeed(seed
0690: 29 3b 0a 20 20 20 20 70 72 6e 67 5f 73 74 61 74  );.    prng_stat
06a0: 65 2e 6a 20 3d 20 30 3b 0a 20 20 20 20 70 72 6e  e.j = 0;.    prn
06b0: 67 5f 73 74 61 74 65 2e 69 20 3d 20 30 3b 0a 20  g_state.i = 0;. 
06c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 35     for(i=0; i<25
06d0: 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  6; i++){.      p
06e0: 72 6e 67 5f 73 74 61 74 65 2e 73 5b 69 5d 20 3d  rng_state.s[i] =
06f0: 20 69 3b 0a 20 20 20 20 20 20 6b 5b 69 5d 20 3d   i;.      k[i] =
0700: 20 73 65 65 64 5b 69 25 73 69 7a 65 6f 66 28 73   seed[i%sizeof(s
0710: 65 65 64 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  eed)];.    }.   
0720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 35 36 3b   for(i=0; i<256;
0730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
0740: 20 74 3b 0a 20 20 20 20 20 20 70 72 6e 67 5f 73   t;.      prng_s
0750: 74 61 74 65 2e 6a 20 3d 20 28 70 72 6e 67 5f 73  tate.j = (prng_s
0760: 74 61 74 65 2e 6a 20 2b 20 70 72 6e 67 5f 73 74  tate.j + prng_st
0770: 61 74 65 2e 73 5b 69 5d 20 2b 20 6b 5b 69 5d 29  ate.s[i] + k[i])
0780: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 74   & 0xff;.      t
0790: 20 3d 20 70 72 6e 67 5f 73 74 61 74 65 2e 73 5b   = prng_state.s[
07a0: 70 72 6e 67 5f 73 74 61 74 65 2e 6a 5d 3b 0a 20  prng_state.j];. 
07b0: 20 20 20 20 20 70 72 6e 67 5f 73 74 61 74 65 2e       prng_state.
07c0: 73 5b 70 72 6e 67 5f 73 74 61 74 65 2e 6a 5d 20  s[prng_state.j] 
07d0: 3d 20 70 72 6e 67 5f 73 74 61 74 65 2e 73 5b 69  = prng_state.s[i
07e0: 5d 3b 0a 20 20 20 20 20 20 70 72 6e 67 5f 73 74  ];.      prng_st
07f0: 61 74 65 2e 73 5b 69 5d 20 3d 20 74 3b 0a 20 20  ate.s[i] = t;.  
0800: 20 20 7d 0a 20 20 20 20 70 72 6e 67 5f 73 74 61    }.    prng_sta
0810: 74 65 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  te.isInit = 1;. 
0820: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
0830: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 73 69 6e  e and return sin
0840: 67 6c 65 20 72 61 6e 64 6f 6d 20 62 79 74 65 0a  gle random byte.
0850: 20 20 2a 2f 0a 20 20 70 72 6e 67 5f 73 74 61 74    */.  prng_stat
0860: 65 2e 69 20 3d 20 28 70 72 6e 67 5f 73 74 61 74  e.i = (prng_stat
0870: 65 2e 69 20 2b 20 31 29 20 26 20 30 78 66 66 3b  e.i + 1) & 0xff;
0880: 0a 20 20 70 72 6e 67 5f 73 74 61 74 65 2e 6a 20  .  prng_state.j 
0890: 3d 20 28 70 72 6e 67 5f 73 74 61 74 65 2e 6a 20  = (prng_state.j 
08a0: 2b 20 70 72 6e 67 5f 73 74 61 74 65 2e 73 5b 70  + prng_state.s[p
08b0: 72 6e 67 5f 73 74 61 74 65 2e 69 5d 29 20 26 20  rng_state.i]) & 
08c0: 30 78 66 66 3b 0a 20 20 74 20 3d 20 70 72 6e 67  0xff;.  t = prng
08d0: 5f 73 74 61 74 65 2e 73 5b 70 72 6e 67 5f 73 74  _state.s[prng_st
08e0: 61 74 65 2e 69 5d 3b 0a 20 20 70 72 6e 67 5f 73  ate.i];.  prng_s
08f0: 74 61 74 65 2e 73 5b 70 72 6e 67 5f 73 74 61 74  tate.s[prng_stat
0900: 65 2e 69 5d 20 3d 20 70 72 6e 67 5f 73 74 61 74  e.i] = prng_stat
0910: 65 2e 73 5b 70 72 6e 67 5f 73 74 61 74 65 2e 6a  e.s[prng_state.j
0920: 5d 3b 0a 20 20 70 72 6e 67 5f 73 74 61 74 65 2e  ];.  prng_state.
0930: 73 5b 70 72 6e 67 5f 73 74 61 74 65 2e 6a 5d 20  s[prng_state.j] 
0940: 3d 20 74 3b 0a 20 20 74 20 3d 20 70 72 6e 67 5f  = t;.  t = prng_
0950: 73 74 61 74 65 2e 73 5b 70 72 6e 67 5f 73 74 61  state.s[prng_sta
0960: 74 65 2e 69 5d 20 2b 20 70 72 6e 67 5f 73 74 61  te.i] + prng_sta
0970: 74 65 2e 73 5b 70 72 6e 67 5f 73 74 61 74 65 2e  te.s[prng_state.
0980: 6a 5d 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 6e  j];.  return prn
0990: 67 5f 73 74 61 74 65 2e 73 5b 74 20 26 20 30 78  g_state.s[t & 0x
09a0: 66 66 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ff];.}../*.** Re
09b0: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 33 32  turn a random 32
09c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54  -bit integer.  T
09d0: 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 67 65  he integer is ge
09e0: 6e 65 72 61 74 65 64 20 62 79 20 6d 61 6b 69 6e  nerated by makin
09f0: 67 0a 2a 2a 20 34 20 63 61 6c 6c 73 20 74 6f 20  g.** 4 calls to 
0a00: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65  sqliteRandomByte
0a10: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
0a20: 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65 72 28 76  eRandomInteger(v
0a30: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 3b 0a 20  oid){.  int r;. 
0a40: 20 69 6e 74 20 69 3b 0a 20 20 72 20 3d 20 73 71   int i;.  r = sq
0a50: 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29  liteRandomByte()
0a60: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 34  ;.  for(i=1; i<4
0a70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 20 3d 20  ; i++){.    r = 
0a80: 28 72 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 52  (r<<8) + sqliteR
0a90: 61 6e 64 6f 6d 42 79 74 65 28 29 3b 0a 20 20 7d  andomByte();.  }
0aa0: 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a  .  return r;.}..
0ab0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 72  /*.** Return a r
0ac0: 61 6e 64 6f 6d 20 31 36 2d 62 69 74 20 75 6e 73  andom 16-bit uns
0ad0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 20 20  igned integer.  
0ae0: 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 67  The integer is g
0af0: 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20 6d  enerated by.** m
0b00: 61 6b 69 6e 67 20 32 20 63 61 6c 6c 73 20 74 6f  aking 2 calls to
0b10: 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74   sqliteRandomByt
0b20: 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
0b30: 74 65 52 61 6e 64 6f 6d 53 68 6f 72 74 28 76 6f  teRandomShort(vo
0b40: 69 64 29 7b 0a 20 20 69 6e 74 20 72 3b 0a 20 20  id){.  int r;.  
0b50: 72 20 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  r = sqliteRandom
0b60: 42 79 74 65 28 29 3b 0a 20 20 72 20 3d 20 28 72  Byte();.  r = (r
0b70: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 52 61 6e  <<8) + sqliteRan
0b80: 64 6f 6d 42 79 74 65 28 29 3b 0a 20 20 72 65 74  domByte();.  ret
0b90: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
0ba0: 47 65 6e 65 72 61 74 65 20 61 20 72 61 6e 64 6f  Generate a rando
0bb0: 6d 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20  m filename with 
0bc0: 74 68 65 20 67 69 76 65 6e 20 70 72 65 66 69 78  the given prefix
0bd0: 2e 20 20 54 68 65 20 6e 65 77 20 66 69 6c 65 6e  .  The new filen
0be0: 61 6d 65 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  ame.** is writte
0bf0: 6e 20 69 6e 74 6f 20 7a 42 75 66 5b 5d 2e 20 20  n into zBuf[].  
0c00: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
0c10: 74 69 6f 6e 20 6d 75 73 74 20 69 6e 73 75 72 65  tion must insure
0c20: 20 74 68 61 74 0a 2a 2a 20 7a 42 75 66 5b 5d 20   that.** zBuf[] 
0c30: 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
0c40: 20 68 6f 6c 64 20 74 68 65 20 70 72 65 66 69 78   hold the prefix
0c50: 20 70 6c 75 73 20 32 30 20 6f 72 20 73 6f 20 65   plus 20 or so e
0c60: 78 74 72 61 0a 2a 2a 20 63 68 61 72 61 63 74 65  xtra.** characte
0c70: 72 73 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 79 20 72  rs..**.** Very r
0c80: 61 6e 64 6f 6d 20 6e 61 6d 65 73 20 61 72 65 20  andom names are 
0c90: 63 68 6f 73 65 6e 20 73 6f 20 74 68 61 74 20 74  chosen so that t
0ca0: 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 0a 2a  he chance of a.*
0cb0: 2a 20 63 6f 6c 6c 69 73 69 6f 6e 20 77 69 74 68  * collision with
0cc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c   an existing fil
0cd0: 65 6e 61 6d 65 20 69 73 20 76 65 72 79 20 76 65  ename is very ve
0ce0: 72 79 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  ry small..*/.voi
0cf0: 64 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 4e 61  d sqliteRandomNa
0d00: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 2c 20 63  me(char *zBuf, c
0d10: 68 61 72 20 2a 7a 50 72 65 66 69 78 29 7b 0a 20  har *zPrefix){. 
0d20: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61   int i, j;.  sta
0d30: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0d40: 52 61 6e 64 6f 6d 43 68 61 72 73 5b 5d 20 3d 20  RandomChars[] = 
0d50: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
0d60: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
0d70: 35 36 37 38 39 22 3b 0a 20 20 73 74 72 63 70 79  56789";.  strcpy
0d80: 28 7a 42 75 66 2c 20 7a 50 72 65 66 69 78 29 3b  (zBuf, zPrefix);
0d90: 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42  .  j = strlen(zB
0da0: 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  uf);.  for(i=0; 
0db0: 69 3c 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<15; i++){.    
0dc0: 69 6e 74 20 63 20 3d 20 73 71 6c 69 74 65 52 61  int c = sqliteRa
0dd0: 6e 64 6f 6d 42 79 74 65 28 29 20 25 20 28 73 69  ndomByte() % (si
0de0: 7a 65 6f 66 28 7a 52 61 6e 64 6f 6d 43 68 61 72  zeof(zRandomChar
0df0: 73 29 20 2d 20 31 29 3b 0a 20 20 20 20 7a 42 75  s) - 1);.    zBu
0e00: 66 5b 6a 2b 2b 5d 20 3d 20 7a 52 61 6e 64 6f 6d  f[j++] = zRandom
0e10: 43 68 61 72 73 5b 63 5d 3b 0a 20 20 7d 0a 20 20  Chars[c];.  }.  
0e20: 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a     zBuf[j] = 0;.}.