]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improved non-locking PRNG.
authordrh <drh@noemail.net>
Fri, 31 Jul 2020 20:56:15 +0000 (20:56 +0000)
committerdrh <drh@noemail.net>
Fri, 31 Jul 2020 20:56:15 +0000 (20:56 +0000)
FossilOrigin-Name: eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665

manifest
manifest.uuid
src/random.c
src/sqliteInt.h

index d44d56837f0a5c1f311713fc6e61d7e081159729..c50bf9f4482e546c6d4792d5496a1d45a4d2cdb0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
-D 2020-07-30T19:19:12.505
+C Improved\snon-locking\sPRNG.
+D 2020-07-31T20:56:15.190
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -537,7 +537,7 @@ F src/pragma.c bdb600be936f66b9fe69d26dfbba4528beaaf4f95c479c85b328a92484e0bf71
 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf
 F src/prepare.c 3d5a761d026052bc888d1b803a06dd2bfe245e8e836d4689f927003549148b0f
 F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6
-F src/random.c f27af4099afaea7284ade5c206224dcfdb2334cfd119d018b470d46356b3f27d
+F src/random.c c984d8426d76752dbd9ff7983e770731ae5e8f4ede84a203df9878d5e8798f11
 F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
 F src/select.c 52f653249973454c4d65b715a628369e4bf754e6952d7c0192760201580de39a
@@ -545,7 +545,7 @@ F src/shell.c.in 352a0a6399ccae40a30f72ea06f52f3791a062bde9b8929a97f345e1584ba31
 F src/sqlite.h.in 48dcf94e19ff17024767f549b966f5889c6cc46060d0d5f386b67289c02ec522
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197
-F src/sqliteInt.h 514c845d7fd813fa33896ff2e0528d78c9a0e7e67cab9350ae9fa35056a68e36
+F src/sqliteInt.h bdf744479fd7991e447ae31ab3c5718a832896c293c71654059cc17073c4dd2f
 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032
 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -1894,7 +1894,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 9a4a02304e3f5dc1d567cf2a9eae4cdb575e02cb37f9ee25928f2325ab192e76 96e3dba2ed3ab0c5b2ecf65a3408633e0767c884d48c270e9ef10ab9fa3ec051
-R 484c7f1ed5b418cb7420cb16e18685de
-U dan
-Z bbb0995908fcfb0e7db17c8da3620f4c
+P e8a6651539a1967185ef7a77f29475fc97c1b600dd050caa793777ed4b69aa94
+R 58cba06716d6b047fae4afd4bcd915cd
+U drh
+Z 71c89dae7e957e702759515f4e180a01
index e30a3d992f10f5aecdd49c7ffd735a25f323787c..ed05720f593f4db415c4bff7c577060c01c27849 100644 (file)
@@ -1 +1 @@
-e8a6651539a1967185ef7a77f29475fc97c1b600dd050caa793777ed4b69aa94
\ No newline at end of file
+eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665
\ No newline at end of file
index dd971ab655f1cd438fbe4dae4ea9a2297db0f678..c90d2a8f3d15ab761da7411867b9092b6fa480b9 100644 (file)
@@ -122,8 +122,13 @@ void sqlite3FastPrngInit(FastPrng *pPrng){
 void sqlite3FastRandomness(FastPrng *pPrng, int N, void *P){
   unsigned char *pOut = (unsigned char*)P;
   while( N-->0 ){
-    pPrng->x = ((pPrng->x)>>1) ^ ((1+~((pPrng->x)&1)) & 0xd0000001);
-    pPrng->y = (pPrng->y)*1103515245 + 12345;
+    /* "x" is a variant of LFSR called "Xorshift" by George Marsaglia */
+    pPrng->x ^= pPrng->x <<13;
+    pPrng->x ^= pPrng->x >>7;
+    pPrng->x ^= pPrng->x <<17;
+    /* "y" is a LCG using Don Kunth's constants from MMIX */
+    pPrng->y = (pPrng->y)*6364136223846793005LL + 1442695040888963407LL;
+    /* XOR the two streams together to give the final result */
     *(pOut++) = (pPrng->x ^ pPrng->y) & 0xff;
   }
 }
index 767e427b891616f4dfcced5d16cb0e3d8dedb683..029852d17db03af074adc6a34062ff3e5e9c9859 100644 (file)
@@ -1230,7 +1230,7 @@ typedef int VList;
 ** pseudo-random number generators.
 */
 struct FastPrng {
-  unsigned int x, y;
+  sqlite3_uint64 x, y;
 };
 
 /*