From: drh Date: Fri, 31 Jul 2020 20:56:15 +0000 (+0000) Subject: Improved non-locking PRNG. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=94281e049f04597091c083576b42af9d4fdad4dd;p=thirdparty%2Fsqlite.git Improved non-locking PRNG. FossilOrigin-Name: eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665 --- diff --git a/manifest b/manifest index d44d56837f..c50bf9f448 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index e30a3d992f..ed05720f59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8a6651539a1967185ef7a77f29475fc97c1b600dd050caa793777ed4b69aa94 \ No newline at end of file +eb7a9c04bdbb297938672526d8c86b5666fb0f9841b9ddc2d9002399301cf665 \ No newline at end of file diff --git a/src/random.c b/src/random.c index dd971ab655..c90d2a8f3d 100644 --- a/src/random.c +++ b/src/random.c @@ -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; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 767e427b89..029852d17d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1230,7 +1230,7 @@ typedef int VList; ** pseudo-random number generators. */ struct FastPrng { - unsigned int x, y; + sqlite3_uint64 x, y; }; /*