In one of our previous blog posts, we showed you how to build a cluster of five SwiftRNG Pro devices to achieve a random number generation speed of 1 Gbps of. In this post, we will demonstrate how to measure the speed and verify the quality of random bits produced by a cluster of ten SwiftRNG Pro devices.

For best results, your host machine should meet or exceed the following specifications:

  • A fast CPU with at least 6 cores. (We used a six core I7-8700 CPU at 3.2 GHz.)
  • A mainboard that supports at least 10 USB high-speed ports (USB 3.0 is recommended). We used a ‘Gigabyte Ultra Durable Motherboard Z370 HD3P LGA 1151’.
  • Cent OS 7.
  • 10 SwiftRNG Pro devices — each device should be plugged directly into an available USB port. No USB hubs should be used in between.
  • SwiftRNG software utilities are built and available for CentOS from a command line. Please visit this address for specific details.

Verify that all ten SwiftRNG Pro devices are ready and accessible by entering the following in the command line:

swrng -ld

The output may look like this:

{DevNum=0 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=26AB737E1C09D20}
{DevNum=1 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=A8258CD5FE7B964}
{DevNum=2 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=7F68712D6D6EB12}
{DevNum=3 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=C73785CD7552FCD}
{DevNum=4 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=C1890C098FB1B92}
{DevNum=5 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=F36D8EA26BA7522}
{DevNum=6 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=52CB6954F44C84E}
{DevNum=7 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=66E05DA74F52BDE}
{DevNum=8 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=B2C27DB40F2409A}
{DevNum=9 DevModel=SWRNGPRO DevVer=V2.0 DevS/N=2B2EE4AFBB420F8}

Verify the cluster generation speed is at 2 Gbps by entering the following in the command line:

swperf-cl-test 10

The output may look like this:

------------------------------------------------------------------------
-- swperf-cl-test - SwiftRNG device cluster performance test utility  --
------------------------------------------------------------------------

Cluster preferred size: 10, actual cluster size: 10 (successfully open)

Setting power profiles to 9 ------------------------------- Success

Post processing  ---( for devices with version 1.2+ )----- disabled 
Performance ------- in progress ------------------ 2000.00 Mbits/sec

Post processing  ------------------------------------------- SHA256 
Performance ------- in progress ------------------ 1333.33 Mbits/sec

Post processing  ------------------------------------------- SHA512 
Performance ------- in progress ------------------ 2000.00 Mbits/sec

Post processing  ---( for devices with version 1.2+ )--- xorshift64 
Performance ------- in progress ------------------ 2000.00 Mbits/sec
Closing device -------------------------------------------- Success

Available for Windows, macOS and Linux, bitcount is a utility that can be used to count the number of 0 and 1 bits in a random byte stream generated by a SwiftRNG device for quality verification. An ideal generator will produce an equal amount of 0 and 1 bits over a period of time; however that is rarely achievable when using real random number generators.

We will use bitcount-cl utility (a cluster version of bitcount) for calculating arithmetic mean of zeroes among all of the random bytes generated by the SwiftRNG Pro cluster. The following command demonstrates how to count 1 and 0 bits for 75,000,000 random blocks (about 1 TB) retrieved from a SwiftRNG Pro cluster (one block equals to 16,000 bytes):

bitcount-cl 75000000 10

This could result in the following output (it will take around 90 minutes to get results):

---------------------------------------------------------------------------------
--- A program for counting 1's and 0's bits retrieved from a SwiftRNG cluster ---
---------------------------------------------------------------------------------

SwiftRNG cluster of 10 devices open successfully

*** downloading random bytes and counting bits using 'default' post processing method ***
retrieved 9600000000000 total bits, 0's bit count: 4800000240406, 1's bit count: 4799999759594, 0's arithmetic mean: 0.500000025

In the output shown above, you will notice a discrepancy between 0 and 1 counts. The cluster produced more 0 bits than 1 bits, however that discrepancy is small and can be ignored. A tiny amount of bias or a small error in random sources would have resulted in a huge discrepancy in counts for 1 terabyte of random data.

Let’s run the same bitcount-cl test several times and record the resulting statistics in a table.

We may end up with the following:

| Total bits sampled | number of bits with 0 values | number of bits with 1 values |  0's arithmetic mean |
| ------------------ | ---------------------------- | ---------------------------- | -------------------- |
| 9600000000000      | 4799999080595                | 4800000919405                | 0.499999904          |
| 9600000000000      | 4800001980675                | 4799998019325                | 0.500000206          |
| 9600000000000      | 4799999260118                | 4800000739882                | 0.499999923          |