From 2db8cf025a74046d48a82caacd195ef04e72d7c7 Mon Sep 17 00:00:00 2001 From: awwit Date: Tue, 5 May 2020 17:35:13 +0300 Subject: [PATCH 1/4] feat: improved v4 performance --- src/rng.js | 4 +++- src/v4.js | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/rng.js b/src/rng.js index 33513bb8..53e5bcd9 100644 --- a/src/rng.js +++ b/src/rng.js @@ -1,5 +1,7 @@ import crypto from 'crypto'; +const rnds8 = new Uint8Array(16); + export default function rng() { - return crypto.randomBytes(16); + return crypto.randomFillSync(rnds8); } diff --git a/src/v4.js b/src/v4.js index 63daa5a4..e252b0db 100644 --- a/src/v4.js +++ b/src/v4.js @@ -2,10 +2,10 @@ import rng from './rng.js'; import bytesToUuid from './bytesToUuid.js'; function v4(options, buf, offset) { - const i = (buf && offset) || 0; + const start = (buf && offset) || 0; if (typeof options === 'string') { - buf = options === 'binary' ? new Uint32Array(16) : null; + buf = options === 'binary' ? new Uint8Array(16) : null; options = null; } @@ -19,12 +19,14 @@ function v4(options, buf, offset) { // Copy bytes to buffer, if provided if (buf) { - for (let ii = 0; ii < 16; ++ii) { - buf[i + ii] = rnds[ii]; + for (let i = 0; i < 16; ++i) { + buf[start + i] = rnds[i]; } + + return buf; } - return buf || bytesToUuid(rnds); + return bytesToUuid(rnds); } export default v4; From 475f831d0a22b9f76a5d6d8f7a177ec5bfeff8e8 Mon Sep 17 00:00:00 2001 From: awwit Date: Tue, 5 May 2020 17:49:23 +0300 Subject: [PATCH 2/4] test: fix for docs:diff --- README_js.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README_js.md b/README_js.md index e20f6580..2eb1a7e4 100644 --- a/README_js.md +++ b/README_js.md @@ -8,9 +8,8 @@ runmd.onRequire = (path) => { runmd.Date.now = () => 1551914748172; let seed = 0xdefaced; -require('crypto').randomBytes = function () { - const a = []; - for (let i = 0; i < 16; i++) a.push((seed = (seed * 0x41a7) & 0x7fffffff) & 0xff); +require('crypto').randomFillSync = function (a) { + for (let i = 0; i < 16; i++) a[i] = (seed = (seed * 0x41a7) & 0x7fffffff) & 0xff; return a; }; ``` From 13ac37dad7afe58ea67b5abc7848aca55a850671 Mon Sep 17 00:00:00 2001 From: awwit Date: Wed, 6 May 2020 23:47:41 +0300 Subject: [PATCH 3/4] feat: moved offset init in v4 --- src/v4.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v4.js b/src/v4.js index e252b0db..44bfa947 100644 --- a/src/v4.js +++ b/src/v4.js @@ -2,8 +2,6 @@ import rng from './rng.js'; import bytesToUuid from './bytesToUuid.js'; function v4(options, buf, offset) { - const start = (buf && offset) || 0; - if (typeof options === 'string') { buf = options === 'binary' ? new Uint8Array(16) : null; options = null; @@ -19,6 +17,8 @@ function v4(options, buf, offset) { // Copy bytes to buffer, if provided if (buf) { + const start = offset || 0; + for (let i = 0; i < 16; ++i) { buf[start + i] = rnds[i]; } From f79caf0c098b05cdaf8acb0a1bcc8139882cfa8b Mon Sep 17 00:00:00 2001 From: awwit Date: Wed, 6 May 2020 23:49:35 +0300 Subject: [PATCH 4/4] test: v4 result with buf arg --- test/unit/v4.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/v4.test.js b/test/unit/v4.test.js index d18f7ea5..6275dd40 100644 --- a/test/unit/v4.test.js +++ b/test/unit/v4.test.js @@ -45,13 +45,14 @@ describe('v4', () => { test('fills one UUID into a buffer as expected', () => { const buffer = []; - v4( + const result = v4( { random: randomBytesFixture, }, buffer, ); assert.deepEqual(buffer, expectedBytes); + assert.strictEqual(buffer, result); }); test('fills two UUIDs into a buffer as expected', () => {