X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=random.js;h=8c0fa86e669b384e4d812478e00b6a61716031c8;hb=b5bab6ee7bdbe7c887cc80499ed29f3c4a34e336;hp=ee5cc617ed12a80050a62cb65a707bd8b2da4899;hpb=da504870febba0179ba92a342528d6f4384e9534;p=benchmarks-js.git diff --git a/random.js b/random.js index ee5cc61..8c0fa86 100644 --- a/random.js +++ b/random.js @@ -1,7 +1,11 @@ +const crypto = require('crypto') const Benchmark = require('benny') -const { secureRandom } = require('./benchmark-utils') +const { + secureRandom, + secureRandomWithRandomValues +} = require('./benchmark-utils') -const maximum = Number.MAX_SAFE_INTEGER +const maximum = 281474976710654 /** * @param max @@ -9,6 +13,9 @@ const maximum = Number.MAX_SAFE_INTEGER * @returns */ function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } max = Math.floor(max) if (min != null && min !== 0) { min = Math.ceil(min) @@ -17,12 +24,35 @@ function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { return Math.floor(secureRandom() * (max + 1)) } +/** + * @param max + * @param min + * @returns + */ +function getSecureRandomIntegerWithRandomValues ( + max = Number.MAX_SAFE_INTEGER, + min = 0 +) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } + max = Math.floor(max) + if (min != null && min !== 0) { + min = Math.ceil(min) + return Math.floor(secureRandomWithRandomValues() * (max - min + 1)) + min + } + return Math.floor(secureRandomWithRandomValues() * (max + 1)) +} + /** * @param max * @param min * @returns */ function getRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { + if (max < min || max < 0 || min < 0) { + throw new RangeError('Invalid interval') + } max = Math.floor(max) if (min != null && min !== 0) { min = Math.ceil(min) @@ -36,7 +66,21 @@ Benchmark.suite( Benchmark.add('Secure random integer generator', () => { getSecureRandomInteger(maximum) }), - Benchmark.add('Random integer generator', () => { + Benchmark.add( + 'Secure random with getRandomValues() integer generator', + () => { + getSecureRandomIntegerWithRandomValues(maximum) + } + ), + Benchmark.add('Crypto random integer generator', (max = maximum, min = 0) => { + max = Math.floor(max) + if (min != null && min !== 0) { + min = Math.ceil(min) + return Math.floor(crypto.randomInt(min, max + 1)) + } + return Math.floor(crypto.randomInt(max + 1)) + }), + Benchmark.add('Math random integer generator', () => { getRandomInteger(maximum) }), Benchmark.cycle(), @@ -56,4 +100,6 @@ Benchmark.suite( format: 'table.html', details: true }) -) +).catch(err => { + console.error(err) +})