Readonly span support by ChrisMcKee · Pull Request #252 · BcryptNet/bcrypt.net

@ChrisMcKee

```

BenchmarkDotNet v0.15.6, Windows 11 (10.0.26100.6899/24H2/2024Update/HudsonValley)
AMD Ryzen 9 9900X 4.40GHz, 1 CPU, 24 logical and 12 physical cores
.NET SDK 10.0.100
  [Host]     : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4
  Job-XJDVJN : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4
  Job-QQRERM : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4
  Job-TDICCM : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4
  Job-DYUUZC : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4
  Job-JIERNF : .NET 8.0.22 (8.0.22, 8.0.2225.52707), X64 RyuJIT x86-64-v4
  Job-QBQHGG : .NET 8.0.22 (8.0.22, 8.0.2225.52707), X64 RyuJIT x86-64-v4
  Job-NOZKUG : .NET 8.0.22 (8.0.22, 8.0.2225.52707), X64 RyuJIT x86-64-v4
  Job-RDWRBK : .NET 8.0.22 (8.0.22, 8.0.2225.52707), X64 RyuJIT x86-64-v4
  Job-RDXXZX : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-RLXPNS : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-XEJGGT : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-URTIUT : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-TUHZZR : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-BXPPFA : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-BQPXRF : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-RIVHIS : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-OVEKXS : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256
  Job-ULWAAK : .NET Framework 4.8.1 (4.8.9310.0), X64 RyuJIT VectorSize=256

Server=True

```
| Method           | Runtime              | Arguments                                     | key                  | salt                 | hash                 | Mean      | Error    | StdDev   | Rank | Allocated |
|----------------- |--------------------- |---------------------------------------------- |--------------------- |--------------------- |--------------------- |----------:|---------:|---------:|-----:|----------:|
| **TestHashValidate** | **.NET 10.0**            | **/p:BCryptVersion=2.1.4**                        | **~!@#$(...)NBFRD [34]** | **$2a$1(...)rOvHe [29]** | **$2a$1(...)JYlfS [60]** |  **40.43 ms** | **0.689 ms** | **0.644 ms** |    **1** |  **69.76 KB** |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.40 ms | 0.396 ms | 0.370 ms |    1 |   5.01 KB |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.64 ms | 0.620 ms | 0.580 ms |    1 |   5.01 KB |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.15 ms | 0.278 ms | 0.260 ms |    1 |   4.45 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  39.95 ms | 0.228 ms | 0.213 ms |    1 |  69.76 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.42 ms | 0.471 ms | 0.441 ms |    1 |   5.01 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.50 ms | 0.432 ms | 0.404 ms |    1 |   5.01 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  40.19 ms | 0.292 ms | 0.273 ms |    1 |   4.45 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=2.0.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.33 ms | 0.481 ms | 0.427 ms |    1 |     70 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.26 ms | 0.336 ms | 0.297 ms |    1 |  69.66 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.39 ms | 0.428 ms | 0.401 ms |    1 |  69.33 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.50 ms | 0.373 ms | 0.349 ms |    1 |  69.33 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.56 ms | 0.557 ms | 0.521 ms |    1 |  68.99 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=2.0.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  43.54 ms | 0.845 ms | 0.940 ms |    1 |     70 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  44.21 ms | 0.512 ms | 0.478 ms |    1 |     70 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  44.64 ms | 0.865 ms | 0.997 ms |    1 |   4.67 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.64 ms | 0.314 ms | 0.293 ms |    1 |   4.67 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)rOvHe [29] | $2a$1(...)JYlfS [60] |  42.59 ms | 0.292 ms | 0.259 ms |    1 |   4.67 KB |
| **TestHashValidate** | **.NET 10.0**            | **/p:BCryptVersion=2.1.4**                        | **~!@#$(...)NBFRD [34]** | **$2a$1(...)nkrPO [29]** | **$2a$1(...)eyhgC [60]** | **160.46 ms** | **1.088 ms** | **0.964 ms** |    **2** | **261.76 KB** |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.22 ms | 0.962 ms | 0.900 ms |    2 |   5.01 KB |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.37 ms | 0.645 ms | 0.572 ms |    2 |   5.01 KB |
| TestHashValidate | .NET 10.0            | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.95 ms | 1.437 ms | 1.274 ms |    2 |   4.45 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 162.36 ms | 3.214 ms | 3.439 ms |    2 | 261.76 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.75 ms | 0.941 ms | 0.786 ms |    2 |   5.01 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.83 ms | 1.753 ms | 1.554 ms |    2 |   5.01 KB |
| TestHashValidate | .NET 8.0             | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 160.47 ms | 1.143 ms | 0.955 ms |    2 |   4.45 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=2.0.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 170.28 ms | 2.024 ms | 1.893 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.68 ms | 1.650 ms | 1.543 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 168.60 ms | 1.189 ms | 1.112 ms |    2 | 262.21 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.15 ms | 1.267 ms | 1.185 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.6.2 | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.73 ms | 2.048 ms | 1.916 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=2.0.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.54 ms | 2.082 ms | 1.948 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=2.1.4                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.22 ms | 1.691 ms | 1.499 ms |    2 | 261.33 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=3.5.0                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 169.25 ms | 1.372 ms | 1.217 ms |    2 |   5.33 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=4.0.3                        | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 172.02 ms | 3.346 ms | 3.436 ms |    2 |   5.33 KB |
| TestHashValidate | .NET Framework 4.8.1 | /p:BCryptVersion=5.0.0-prerelease.g5300270033 | ~!@#$(...)NBFRD [34] | $2a$1(...)nkrPO [29] | $2a$1(...)eyhgC [60] | 173.11 ms | 3.154 ms | 3.375 ms |    2 |   5.33 KB |