Commit | Line | Data |
---|---|---|
53559e8c | 1 | const crypto = require('crypto') |
f10b1da0 | 2 | const Benchmark = require('benny') |
99d76a65 JB |
3 | const { |
4 | secureRandom, | |
5 | secureRandomWithRandomValues | |
6 | } = require('./benchmark-utils') | |
aa697b2f | 7 | |
804a6375 | 8 | const maximum = 281474976710654 |
aa697b2f | 9 | |
aa697b2f JB |
10 | /** |
11 | * @param max | |
12 | * @param min | |
7fd91296 | 13 | * @returns |
aa697b2f | 14 | */ |
f10b1da0 | 15 | function getSecureRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { |
7e861288 JB |
16 | if (max < min || max < 0 || min < 0) { |
17 | throw new RangeError('Invalid interval') | |
18 | } | |
aa697b2f | 19 | max = Math.floor(max) |
da504870 | 20 | if (min != null && min !== 0) { |
aa697b2f JB |
21 | min = Math.ceil(min) |
22 | return Math.floor(secureRandom() * (max - min + 1)) + min | |
23 | } | |
24 | return Math.floor(secureRandom() * (max + 1)) | |
25 | } | |
26 | ||
99d76a65 JB |
27 | /** |
28 | * @param max | |
29 | * @param min | |
30 | * @returns | |
31 | */ | |
32 | function getSecureRandomIntegerWithRandomValues ( | |
33 | max = Number.MAX_SAFE_INTEGER, | |
34 | min = 0 | |
35 | ) { | |
36 | if (max < min || max < 0 || min < 0) { | |
37 | throw new RangeError('Invalid interval') | |
38 | } | |
39 | max = Math.floor(max) | |
40 | if (min != null && min !== 0) { | |
41 | min = Math.ceil(min) | |
42 | return Math.floor(secureRandomWithRandomValues() * (max - min + 1)) + min | |
43 | } | |
44 | return Math.floor(secureRandomWithRandomValues() * (max + 1)) | |
45 | } | |
46 | ||
aa697b2f JB |
47 | /** |
48 | * @param max | |
49 | * @param min | |
7fd91296 | 50 | * @returns |
aa697b2f | 51 | */ |
f10b1da0 | 52 | function getRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { |
7e861288 JB |
53 | if (max < min || max < 0 || min < 0) { |
54 | throw new RangeError('Invalid interval') | |
55 | } | |
aa697b2f | 56 | max = Math.floor(max) |
da504870 | 57 | if (min != null && min !== 0) { |
aa697b2f JB |
58 | min = Math.ceil(min) |
59 | return Math.floor(Math.random() * (max - min + 1)) + min | |
60 | } | |
61 | return Math.floor(Math.random() * (max + 1)) | |
62 | } | |
63 | ||
f10b1da0 JB |
64 | Benchmark.suite( |
65 | 'Random Integer Generator', | |
e2bfb549 | 66 | Benchmark.add('Secure random integer generator', () => { |
aa697b2f | 67 | getSecureRandomInteger(maximum) |
f10b1da0 | 68 | }), |
99d76a65 JB |
69 | Benchmark.add( |
70 | 'Secure random with getRandomValues() integer generator', | |
71 | () => { | |
72 | getSecureRandomIntegerWithRandomValues(maximum) | |
73 | } | |
74 | ), | |
804a6375 JB |
75 | Benchmark.add('Crypto random integer generator', (max = maximum, min = 0) => { |
76 | max = Math.floor(max) | |
d7a92496 | 77 | if (min != null && min !== 0) { |
804a6375 JB |
78 | min = Math.ceil(min) |
79 | return Math.floor(crypto.randomInt(min, max + 1)) | |
80 | } | |
81 | return Math.floor(crypto.randomInt(max + 1)) | |
99d76a65 JB |
82 | }), |
83 | Benchmark.add('Math random integer generator', () => { | |
aa697b2f | 84 | getRandomInteger(maximum) |
f10b1da0 JB |
85 | }), |
86 | Benchmark.cycle(), | |
87 | Benchmark.complete(), | |
fb341cfe JB |
88 | Benchmark.save({ |
89 | file: 'random-integer-generator', | |
90 | format: 'json', | |
91 | details: true | |
92 | }), | |
93 | Benchmark.save({ | |
94 | file: 'random-integer-generator', | |
95 | format: 'chart.html', | |
96 | details: true | |
97 | }), | |
98 | Benchmark.save({ | |
99 | file: 'random-integer-generator', | |
100 | format: 'table.html', | |
101 | details: true | |
102 | }) | |
4b16770a JB |
103 | ).catch(err => { |
104 | console.error(err) | |
105 | }) |