diff --git a/.github/workflows/benchmark-new.yml b/.github/workflows/benchmark-new.yml new file mode 100644 index 00000000..93c51c37 --- /dev/null +++ b/.github/workflows/benchmark-new.yml @@ -0,0 +1,110 @@ +name: Benchmarks (new) +on: + workflow_dispatch: + +jobs: + define-matrix: + runs-on: ubuntu-latest + + outputs: + commits: ${{ steps.commits.outputs.commits }} + + steps: + - id: commits + run: | + # Notable commits + # 5932607c19c2dfa2fb617844c7a4c67cc825af32 JSONPath ambiguity changes + # 5b137816d80105124ba93d7a6143bc5a75c1c22b v1.0.0-rc2 + # 5bad2969f1126fc499af42691bcbbfdbe4048bb8 v1.0.0-rc3 + # c0e63df3c186be9a7fa4c11ed385d8cbedfd4e8f v1.0.0, ValueMaskers added + # 7bc09acfdf5f331ba6baa56bdb866987aeb6f90e v1.0.1 + # ba6154a80531757249916d533ef6f5bdd6bb42c8 Streaming added + echo 'commits=["5932607c19c2dfa2fb617844c7a4c67cc825af32","9246c24ef85349fdfecc77775e59f28b962faced","6dd707f57e215d843177e58430e36f9040ea44fa","da82ad7933cfb53d012a31ea2408af3fd646e700","5b137816d80105124ba93d7a6143bc5a75c1c22b","09e7d152fd1930a3d79475ad3b6e56ca0be25fbd","564c268f2e97aa6587ee4a107dbfe1dc146bda1f","84d1e903202c32fd1d913c6562f72a5a412c4a4e","d8627a4b121f4997214c1c8aa5cf0b7e69665588","ba76534ba5d8c5f7ec6c7932b62202d670370fd3","13589a195329ce613bbcf7015e58d74b25c32d5a","775265e68b464f09d3487dbe80c27a28b901b815","49698e8f1f8219699e846f51519271ad50d40a9c","831df5a15dfa0e4df8dd80b3534450f829e61093","d7a7d5635093e35b0b6631383b48fe59bf6b9a8f","5bad2969f1126fc499af42691bcbbfdbe4048bb8","0fdaf7d9f98ca36a1f321362687b463fab007905","3f618fde3a1ab52c1b39cbaee4c3505f52ee383f","be13b37bb16c89c64a4effea7464ef4e1504b006","da987bf26e58c8f30dcd0c96c53824bca000065e","b4a0cc1838c9dc3572b8081a97b2ee79754f1aa9","518a78b113fb1eb3692c80398a5780a13818fa54","556fdf98d69938023e28eac7435cf85ec9b62178","98db254e96d194722950b4c13f8a41df653b08ac","97cae59fa76229f87a40ea72f729c3f4a0ae87b3","03d5744c3429a3822677db7e63149e64e4434f3a","82c901bdc42074c3abfa27166e6edd607c61ef59","12324ffb915b9333b8b52d10e2ee7c629040fb72","c0e63df3c186be9a7fa4c11ed385d8cbedfd4e8f","bc96c81d7d3a0a7d1e18220e4d87718317f8e2e0","a2d753db1948713da7395a1e59179cd9575eec97","c5ec892454ecc797406525600343e47e718eeecc","84cb657b6a8540f178bc0d1e8847525569c6711e","96d0afc5de28256c1b27860255ee08603bc84d1a","04140866d42b3ec1f5639225f3faa0a00897920b","63056ff8be941ef8a0cc1dec09d6f273e17a44d6","7eadb0c71ad61fdc331d3bec078e69bf03a1d31d","b5740af7656fea664647c0a42c4fef36524cc964","a918150d8f7efb5372d63c0d5d6e0a9107f7f444","0273c3c8f36d80c3c59d8d495ca6f715713da668","eb487d5db59671cf92f3d34dacbb9ae439a22490","6afab482d9a65b8d0fc53b938d86d1a5e1af0ecd","5ed1e110f48dedaaab35615f03c2f2f5a4c2271b","c0d0067a1494c29644577fc6e337bc06a65ecfe4","aab32f5c5c0770d355b6db87f04b7e3bd4702895","0fa83bf3ba2817e890db2f996a934d87a5bff034","7bc09acfdf5f331ba6baa56bdb866987aeb6f90e","ec96ef1ca1d6bb8f01250e78d3ed3797a0a7e94b","0ffdf387de52d06ff784c27886a9127e40dc2888","72cafa7b9b1e75765d16882256aa9149ce043a20","bc9002b2d0ec2b08f408cb460ad9822d8ff624e3","d3422b092acfd5d843a4dc01283ccc3ec4804de3","899bacd419db3aa138476b68b612d3c07f53057b","a7ce47364b96f350282a34613072009fc960e21a","2e81c1990dc219b07cdd7bab085621c1c055838e","76c4f517a84fec15b10649378e0470123385772c","06991511583a8b5010cfc1386037d1705a973bab","4890345f43909d4e32ad8a545ec88574357bb15b","341ff88579891e4045c31552cfeb505d162b1644","00bf0bb53a6a2ddb174146f4f4bbd72bed9b988f","50f5f1175e32e209db269f92e603639a47e1bfd8","f1cbd27c378499fcf63c267ac30505833540aa28","0d5af5437b2b64ab353f159780a88640b4cb1a5f","56d1c2f59c4f48b8a2dc1103d76dab8a12c361d6","fa66f6862fce74a4834ad6fb9014957250d92fef","f8aeda7492b95b44b4097c588c1d56c5d0739776","a55717ddea3e0b01998a7a5ddd3e84a49fe515a1","5bf2e9c3fc7a14e29c1f59a4357c8be69dbd503f","4da8dfa40e2992e542c56a46b84091e611f6b053","4a47d413817dc76942fb94b9bf9b2c12ba2dd773","af769ef4ddf015bb1ac00fc1fdb6b55dd99a1f1e","e8d990e11db351c9bc114b7e247030c3efeb27cb","4c98d6e25a642e6af68835718b5ce67aea110539","9568ca4ed5bb4eedb020b2ee9a21097f599c3aa0","2458b81a40ff94aeb469a23b8fb5f4fefbfeaf2b","ba6154a80531757249916d533ef6f5bdd6bb42c8","3a0643bc5090428b7a2a60d36effa617e9b9d1a6","070553b21d5e1354c10f67d14114a841c8d54052","226a0d5a7d6d1059dc7aa068274af5c7290c8c02","0b6ea3d4a93d6f3d3b034d5c218680941f543ea5","a0811f05576700a7af7a5739662bb9b8052d41d0","1a06bda8ffa66744505286dff148842822782a26","9f0690f5b4aa76839854ee9d1bc2674dc479cbfa","72d1f4bb38510947feb53931d4f29c076496e168"]' >> "$GITHUB_OUTPUT" + + benchmarks: + if: ${{ github.repository == 'Breus/json-masker' }} + needs: + - define-matrix + permissions: + contents: read + pull-requests: write # for benchmark comment + env: + GITHUB_PAT_1: github_p + GITHUB_PAT_2: at_11ADUR3ZY0rtQnrriME4t4_eKeXZAaMj7h0cdaZ6CFkARS9m3Vac85DFgXiglr2Lrx44XN7CE63jmftTra + strategy: + matrix: + commit: ${{ fromJSON(needs.define-matrix.outputs.commits) }} + max-parallel: 8 + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 # checkout latest in this branch + + - uses: actions/checkout@v4 # checkout older commit to run benchmarks against + with: + ref: ${{ matrix.commit }} + path: json-masker-ref + + - id: frankenstein-the-benchmarks + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs') + + let currentCommit = '${{ matrix.commit }}' + let allCommits = JSON.parse('${{ needs.define-matrix.outputs.commits }}') + + let commitIndex = allCommits.indexOf(currentCommit) % 8; + + core.setOutput('sleep', commitIndex * 10) + + // checking ValueMaskers availability + if (allCommits.indexOf(currentCommit) < allCommits.indexOf('c0e63df3c186be9a7fa4c11ed385d8cbedfd4e8f')) { + fs.unlinkSync('src/jmh/java/dev/blaauwendraad/masker/json/ValueMaskerBenchmark.java') + } + // checking streaming availability + if (allCommits.indexOf(currentCommit) < allCommits.indexOf('ba6154a80531757249916d533ef6f5bdd6bb42c8')) { + fs.unlinkSync('src/jmh/java/dev/blaauwendraad/masker/json/StreamTypeBenchmark.java') + fs.unlinkSync('src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java') + fs.renameSync('src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark_no_streaming.java', 'src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java') + } else { + fs.unlinkSync('src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark_no_streaming.java') + } + + // Remove the code from existing branch + fs.rmdirSync('src/main', { recursive: true, force: true }) + fs.rmdirSync('src/test', { recursive: true, force: true }) + // Copy the code from the ref branch + fs.cpSync('json-masker-ref/src/main', 'src/main', { recursive: true }) + fs.cpSync('json-masker-ref/src/test', 'src/test', { recursive: true }) + + - run: sleep ${{ steps.frankenstein-the-benchmarks.outputs.sleep }} + + - name: Setup JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: 'gradle' + + - name: Prepare JMH + run: ./gradlew jmhJar + + - name: Run JMH benchmark + run: java -jar build/libs/json-masker-*-jmh.jar -wi 1 -i 4 -f 1 -rf json + + - name: Update benchmark results + uses: benchmark-action/github-action-benchmark@v1 + with: + name: JMH Benchmark + tool: 'jmh' + output-file-path: jmh-result.json + benchmark-data-dir-path: . + github-token: ${{ env.GITHUB_PAT_1 }}${{ env.GITHUB_PAT_2 }} + gh-repository: github.com/gavlyukovskiy/json-masker-benchmarks + alert-threshold: '120%' + comment-on-alert: false + comment-always: false + fail-on-alert: false + auto-push: ${{ github.event_name != 'pull_request' }} + ref: ${{ matrix.commit }} diff --git a/build.gradle.kts b/build.gradle.kts index 5b8510f4..b2843f1d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,3 @@ -import net.ltgt.gradle.errorprone.errorprone import org.sonarqube.gradle.SonarTask plugins { @@ -6,7 +5,6 @@ plugins { alias(libs.plugins.test.logger) alias(libs.plugins.nexus.publish) alias(libs.plugins.jmh) - alias(libs.plugins.errorprone) `maven-publish` `java-library` signing @@ -37,6 +35,7 @@ java { dependencies { "nullabilityAnnotationsImplementation"(libs.jspecify) + "nullabilityAnnotationsImplementation"("com.google.code.findbugs:jsr305:3.0.2") testImplementation(libs.assertj.core) testImplementation(libs.jackson.databind) @@ -46,8 +45,6 @@ dependencies { jmh(libs.jmh.core) jmhAnnotationProcessor(libs.jmh.generator.annproccesor) - errorprone(libs.nullaway) - errorprone(libs.errorprone.core) } publishing { @@ -165,31 +162,6 @@ tasks { } withType().configureEach { - options.errorprone { - error( - "CheckedExceptionNotThrown", - "FunctionalInterfaceClash", - "NonFinalStaticField", - "NullAway", - "RedundantOverride", - "RedundantThrows", - "RemoveUnusedImports", - "UnnecessarilyFullyQualified", - "UnnecessarilyUsedValue", - "UnnecessaryBoxedAssignment", - "UnnecessaryBoxedVariable", - "UnnecessaryFinal", - "UnusedException", - "WildcardImport", - ) - disable( - "StringCaseLocaleUsage", - "MissingSummary", - ) - option("NullAway:JSpecifyMode") - option("NullAway:AnnotatedPackages", "dev.blaauwendraad.masker") - excludedPaths = ".*/build/generated/.*" - } options.encoding = "UTF-8" } diff --git a/src/jmh/benchmark-history/2022-06-09.md b/src/jmh/benchmark-history/2022-06-09.md deleted file mode 100644 index 80b59dee..00000000 --- a/src/jmh/benchmark-history/2022-06-09.md +++ /dev/null @@ -1,11 +0,0 @@ -- CPU: Apple Macbook Pro M1, 2020 - -```text -Benchmark Mode Cnt Score Error Units -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysLargeJson avgt 2649,220 ns/op -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysSmallJson avgt 246,187 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysLargeJson avgt 260032,673 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysSmallJson avgt 15819,945 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysLargeJson avgt 142586,845 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysSmallJson avgt 3156,930 ns/op -``` diff --git a/src/jmh/benchmark-history/2022-07-02.md b/src/jmh/benchmark-history/2022-07-02.md deleted file mode 100644 index 4c06036b..00000000 --- a/src/jmh/benchmark-history/2022-07-02.md +++ /dev/null @@ -1,11 +0,0 @@ -- CPU: Apple Macbook Pro M1, 2020 - -```text -Benchmark Mode Cnt Score Error Units -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysLargeJson avgt 2741,496 ns/op -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysSmallJson avgt 153,333 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysLargeJson avgt 259726,763 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysSmallJson avgt 14396,989 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysLargeJson avgt 146207,944 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysSmallJson avgt 3102,921 ns/op -``` diff --git a/src/jmh/benchmark-history/2022-07-12.md b/src/jmh/benchmark-history/2022-07-12.md deleted file mode 100644 index ca5113c1..00000000 --- a/src/jmh/benchmark-history/2022-07-12.md +++ /dev/null @@ -1,11 +0,0 @@ -- CPU: Apple Macbook Pro M1, 2020 - -```text -Benchmark Mode Cnt Score Error Units -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysLargeJson avgt 2512,185 ns/op -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysSmallJson avgt 165,912 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysLargeJson avgt 262763,770 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysSmallJson avgt 14650,831 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysLargeJson avgt 142375,488 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysSmallJson avgt 3125,639 ns/op -``` diff --git a/src/jmh/benchmark-history/2022-09-11.md b/src/jmh/benchmark-history/2022-09-11.md deleted file mode 100644 index f0389ee9..00000000 --- a/src/jmh/benchmark-history/2022-09-11.md +++ /dev/null @@ -1,12 +0,0 @@ -- CPU: Apple Macbook Pro M1, 2020 -- Java: 17.0.7 - -```text -Benchmark Mode Cnt Score Error Units -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysLargeJson avgt 2560,033 ns/op -JsonMaskMultipleTargetKeysBenchmark.keyContainsMaskMultiKeysSmallJson avgt 156,414 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysLargeJson avgt 258476,113 ns/op -JsonMaskMultipleTargetKeysBenchmark.loopMaskMultipleKeysSmallJson avgt 14488,738 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysLargeJson avgt 141392,930 ns/op -JsonMaskMultipleTargetKeysBenchmark.parseAndMaskMultiKeysSmallJson avgt 3079,517 ns/op -``` diff --git a/src/jmh/benchmark-history/2023-11-17.md b/src/jmh/benchmark-history/2023-11-17.md deleted file mode 100644 index 24046f0b..00000000 --- a/src/jmh/benchmark-history/2023-11-17.md +++ /dev/null @@ -1,55 +0,0 @@ -- OS: Windows 11 -- CPU: AMD Ryzen 5 7600X -- Java: 17.0.7 - -```text -Benchmark (jsonSize) (numberOfKeys) (obfuscationLength) Mode Cnt Score Error Units -BaselineBenchmark.jackson 200b 1 N/A thrpt 1262056.726 ops/s -BaselineBenchmark.jackson 200b 100 N/A thrpt 1065026.221 ops/s -BaselineBenchmark.jackson 4kb 1 N/A thrpt 92561.560 ops/s -BaselineBenchmark.jackson 4kb 100 N/A thrpt 75569.597 ops/s -BaselineBenchmark.jackson 128kb 1 N/A thrpt 1879.056 ops/s -BaselineBenchmark.jackson 128kb 100 N/A thrpt 1911.682 ops/s -BaselineBenchmark.jackson 2mb 1 N/A thrpt 18.959 ops/s -BaselineBenchmark.jackson 2mb 100 N/A thrpt 7.923 ops/s -BaselineBenchmark.noop 200b 1 N/A thrpt 26769763.013 ops/s -BaselineBenchmark.noop 200b 100 N/A thrpt 27416983.668 ops/s -BaselineBenchmark.noop 4kb 1 N/A thrpt 1566917.285 ops/s -BaselineBenchmark.noop 4kb 100 N/A thrpt 1567094.010 ops/s -BaselineBenchmark.noop 128kb 1 N/A thrpt 36703.455 ops/s -BaselineBenchmark.noop 128kb 100 N/A thrpt 36643.225 ops/s -BaselineBenchmark.noop 2mb 1 N/A thrpt 2263.673 ops/s -BaselineBenchmark.noop 2mb 100 N/A thrpt 2263.683 ops/s -JsonMaskerBenchmark.maskJsonBytes 200b 1 -1 thrpt 3153816.154 ops/s -JsonMaskerBenchmark.maskJsonBytes 200b 1 8 thrpt 3182263.676 ops/s -JsonMaskerBenchmark.maskJsonBytes 200b 100 -1 thrpt 2821470.475 ops/s -JsonMaskerBenchmark.maskJsonBytes 200b 100 8 thrpt 2187225.371 ops/s -JsonMaskerBenchmark.maskJsonBytes 4kb 1 -1 thrpt 451014.030 ops/s -JsonMaskerBenchmark.maskJsonBytes 4kb 1 8 thrpt 445217.877 ops/s -JsonMaskerBenchmark.maskJsonBytes 4kb 100 -1 thrpt 405496.513 ops/s -JsonMaskerBenchmark.maskJsonBytes 4kb 100 8 thrpt 281729.243 ops/s -JsonMaskerBenchmark.maskJsonBytes 128kb 1 -1 thrpt 8979.774 ops/s -JsonMaskerBenchmark.maskJsonBytes 128kb 1 8 thrpt 9111.752 ops/s -JsonMaskerBenchmark.maskJsonBytes 128kb 100 -1 thrpt 8294.319 ops/s -JsonMaskerBenchmark.maskJsonBytes 128kb 100 8 thrpt 5517.200 ops/s -JsonMaskerBenchmark.maskJsonBytes 2mb 1 -1 thrpt 2643.338 ops/s -JsonMaskerBenchmark.maskJsonBytes 2mb 1 8 thrpt 2646.343 ops/s -JsonMaskerBenchmark.maskJsonBytes 2mb 100 -1 thrpt 2493.899 ops/s -JsonMaskerBenchmark.maskJsonBytes 2mb 100 8 thrpt 731.205 ops/s -JsonMaskerBenchmark.maskJsonString 200b 1 -1 thrpt 2945155.807 ops/s -JsonMaskerBenchmark.maskJsonString 200b 1 8 thrpt 2930495.471 ops/s -JsonMaskerBenchmark.maskJsonString 200b 100 -1 thrpt 2646630.427 ops/s -JsonMaskerBenchmark.maskJsonString 200b 100 8 thrpt 2091125.858 ops/s -JsonMaskerBenchmark.maskJsonString 4kb 1 -1 thrpt 381344.021 ops/s -JsonMaskerBenchmark.maskJsonString 4kb 1 8 thrpt 391209.641 ops/s -JsonMaskerBenchmark.maskJsonString 4kb 100 -1 thrpt 346559.740 ops/s -JsonMaskerBenchmark.maskJsonString 4kb 100 8 thrpt 235969.211 ops/s -JsonMaskerBenchmark.maskJsonString 128kb 1 -1 thrpt 7982.235 ops/s -JsonMaskerBenchmark.maskJsonString 128kb 1 8 thrpt 7969.799 ops/s -JsonMaskerBenchmark.maskJsonString 128kb 100 -1 thrpt 7284.012 ops/s -JsonMaskerBenchmark.maskJsonString 128kb 100 8 thrpt 5076.018 ops/s -JsonMaskerBenchmark.maskJsonString 2mb 1 -1 thrpt 1324.640 ops/s -JsonMaskerBenchmark.maskJsonString 2mb 1 8 thrpt 1314.710 ops/s -JsonMaskerBenchmark.maskJsonString 2mb 100 -1 thrpt 1312.198 ops/s -JsonMaskerBenchmark.maskJsonString 2mb 100 8 thrpt 311.324 ops/s -``` diff --git a/src/jmh/benchmark-history/2023-12-16.md b/src/jmh/benchmark-history/2023-12-16.md deleted file mode 100644 index d5c500ac..00000000 --- a/src/jmh/benchmark-history/2023-12-16.md +++ /dev/null @@ -1,55 +0,0 @@ -- OS: Windows 11 -- CPU: AMD Ryzen 5 7600X -- Java: 17.0.7 - -```text -Benchmark (jsonSize) (maskedKeyProbability) (obfuscationLength) Mode Cnt Score Error Units -JsonMaskerBenchmark.baselineCountBytes 1kb 0.01 none thrpt 4137546.836 ops/s -JsonMaskerBenchmark.baselineCountBytes 1kb 0.01 8 thrpt 4207147.995 ops/s -JsonMaskerBenchmark.baselineCountBytes 1kb 0.1 none thrpt 3973935.739 ops/s -JsonMaskerBenchmark.baselineCountBytes 1kb 0.1 8 thrpt 4243529.522 ops/s -JsonMaskerBenchmark.baselineCountBytes 128kb 0.01 none thrpt 34399.894 ops/s -JsonMaskerBenchmark.baselineCountBytes 128kb 0.01 8 thrpt 34071.491 ops/s -JsonMaskerBenchmark.baselineCountBytes 128kb 0.1 none thrpt 34196.393 ops/s -JsonMaskerBenchmark.baselineCountBytes 128kb 0.1 8 thrpt 34305.240 ops/s -JsonMaskerBenchmark.baselineCountBytes 2mb 0.01 none thrpt 2269.735 ops/s -JsonMaskerBenchmark.baselineCountBytes 2mb 0.01 8 thrpt 2271.118 ops/s -JsonMaskerBenchmark.baselineCountBytes 2mb 0.1 none thrpt 2253.199 ops/s -JsonMaskerBenchmark.baselineCountBytes 2mb 0.1 8 thrpt 2247.771 ops/s -JsonMaskerBenchmark.jacksonString 1kb 0.01 none thrpt 132045.083 ops/s -JsonMaskerBenchmark.jacksonString 1kb 0.01 8 thrpt 146492.278 ops/s -JsonMaskerBenchmark.jacksonString 1kb 0.1 none thrpt 112680.854 ops/s -JsonMaskerBenchmark.jacksonString 1kb 0.1 8 thrpt 106190.246 ops/s -JsonMaskerBenchmark.jacksonString 128kb 0.01 none thrpt 726.820 ops/s -JsonMaskerBenchmark.jacksonString 128kb 0.01 8 thrpt 721.674 ops/s -JsonMaskerBenchmark.jacksonString 128kb 0.1 none thrpt 713.354 ops/s -JsonMaskerBenchmark.jacksonString 128kb 0.1 8 thrpt 707.308 ops/s -JsonMaskerBenchmark.jacksonString 2mb 0.01 none thrpt 29.844 ops/s -JsonMaskerBenchmark.jacksonString 2mb 0.01 8 thrpt 30.274 ops/s -JsonMaskerBenchmark.jacksonString 2mb 0.1 none thrpt 28.829 ops/s -JsonMaskerBenchmark.jacksonString 2mb 0.1 8 thrpt 29.443 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 1kb 0.01 none thrpt 2361426.457 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 1kb 0.01 8 thrpt 1236815.130 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 1kb 0.1 none thrpt 1225579.252 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 1kb 0.1 8 thrpt 2366171.431 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 128kb 0.01 none thrpt 10880.117 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 128kb 0.01 8 thrpt 13028.774 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 128kb 0.1 none thrpt 11377.003 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 128kb 0.1 8 thrpt 2722.984 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 2mb 0.01 none thrpt 419.823 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 2mb 0.01 8 thrpt 131.931 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 2mb 0.1 none thrpt 22.044 ops/s -JsonMaskerBenchmark.jsonMaskerBytes 2mb 0.1 8 thrpt 16.839 ops/s -JsonMaskerBenchmark.jsonMaskerString 1kb 0.01 none thrpt 531718.252 ops/s -JsonMaskerBenchmark.jsonMaskerString 1kb 0.01 8 thrpt 431436.627 ops/s -JsonMaskerBenchmark.jsonMaskerString 1kb 0.1 none thrpt 476463.063 ops/s -JsonMaskerBenchmark.jsonMaskerString 1kb 0.1 8 thrpt 549124.253 ops/s -JsonMaskerBenchmark.jsonMaskerString 128kb 0.01 none thrpt 2200.777 ops/s -JsonMaskerBenchmark.jsonMaskerString 128kb 0.01 8 thrpt 2076.402 ops/s -JsonMaskerBenchmark.jsonMaskerString 128kb 0.1 none thrpt 1371.502 ops/s -JsonMaskerBenchmark.jsonMaskerString 128kb 0.1 8 thrpt 1577.709 ops/s -JsonMaskerBenchmark.jsonMaskerString 2mb 0.01 none thrpt 86.108 ops/s -JsonMaskerBenchmark.jsonMaskerString 2mb 0.01 8 thrpt 78.117 ops/s -JsonMaskerBenchmark.jsonMaskerString 2mb 0.1 none thrpt 16.633 ops/s -JsonMaskerBenchmark.jsonMaskerString 2mb 0.1 8 thrpt 17.281 ops/s -``` \ No newline at end of file diff --git a/src/jmh/benchmark-history/2023-12-20.md b/src/jmh/benchmark-history/2023-12-20.md deleted file mode 100644 index a732e283..00000000 --- a/src/jmh/benchmark-history/2023-12-20.md +++ /dev/null @@ -1,88 +0,0 @@ -- OS: Windows 11 -- CPU: AMD Ryzen 5 7600X -- Java: 17.0.7 - -```text -Benchmark (characters) (jsonSize) (maskedKeyProbability) (obfuscationLength) Mode Cnt Score Error Units -BaselineBenchmark.countBytes N/A 1kb N/A N/A thrpt 4074057.577 ops/s -BaselineBenchmark.countBytes N/A 128kb N/A N/A thrpt 33992.898 ops/s -BaselineBenchmark.countBytes N/A 2mb N/A N/A thrpt 2253.498 ops/s -BaselineBenchmark.jacksonParseAndMask N/A 1kb N/A N/A thrpt 195683.419 ops/s -BaselineBenchmark.jacksonParseAndMask N/A 128kb N/A N/A thrpt 722.508 ops/s -BaselineBenchmark.jacksonParseAndMask N/A 2mb N/A N/A thrpt 27.133 ops/s -BaselineBenchmark.regexReplace N/A 1kb N/A N/A thrpt 11729.500 ops/s -BaselineBenchmark.regexReplace N/A 128kb N/A N/A thrpt 74.242 ops/s -BaselineBenchmark.regexReplace N/A 2mb N/A N/A thrpt 5.408 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 none thrpt 2672694.020 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 8 thrpt 838428.960 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.1 none thrpt 2025416.416 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.1 8 thrpt 1653016.050 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 none thrpt 12053.279 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 8 thrpt 5361.050 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.1 none thrpt 9459.132 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.1 8 thrpt 337.606 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 none thrpt 487.307 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 8 thrpt 12.569 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.1 none thrpt 431.350 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.1 8 thrpt 1.966 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 none thrpt 2819386.235 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 8 thrpt 2502055.170 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.1 none thrpt 2541085.908 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.1 8 thrpt 1486612.366 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 none thrpt 12533.878 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 8 thrpt 4054.251 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.1 none thrpt 8758.617 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.1 8 thrpt 473.697 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 none thrpt 454.732 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 8 thrpt 13.287 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.1 none thrpt 14.704 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.1 8 thrpt 1.795 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 none thrpt 3579539.318 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 8 thrpt 3591563.062 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.1 none thrpt 3436922.834 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.1 8 thrpt 3688532.991 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 none thrpt 14381.218 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 8 thrpt 2160.292 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.1 none thrpt 9132.054 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.1 8 thrpt 417.713 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 none thrpt 17.061 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 8 thrpt 19.017 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.1 none thrpt 2.855 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.1 8 thrpt 2.490 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 none thrpt 1559147.328 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 8 thrpt 1720395.410 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.1 none thrpt 1340913.940 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.1 8 thrpt 726683.288 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 none thrpt 9707.708 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 8 thrpt 2644.963 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.1 none thrpt 8718.749 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.1 8 thrpt 538.299 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 none thrpt 400.015 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 8 thrpt 16.719 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.1 none thrpt 347.794 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.1 8 thrpt 1.727 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 none thrpt 1691838.470 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 8 thrpt 1577028.930 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.1 none thrpt 935689.291 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.1 8 thrpt 472768.967 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 none thrpt 8974.417 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 8 thrpt 1963.733 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.1 none thrpt 1533.492 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.1 8 thrpt 425.324 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 none thrpt 72.243 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 8 thrpt 18.094 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.1 none thrpt 10.938 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.1 8 thrpt 1.873 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 none thrpt 592610.914 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 8 thrpt 632087.084 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.1 none thrpt 507522.810 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.1 8 thrpt 579923.646 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 none thrpt 1454.359 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 8 thrpt 1426.964 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.1 none thrpt 546.959 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.1 8 thrpt 348.036 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 none thrpt 17.853 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 8 thrpt 23.375 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.1 none thrpt 2.752 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.1 8 thrpt 2.885 ops/s -``` \ No newline at end of file diff --git a/src/jmh/benchmark-history/2024-01-03.md b/src/jmh/benchmark-history/2024-01-03.md deleted file mode 100644 index bd12bf4b..00000000 --- a/src/jmh/benchmark-history/2024-01-03.md +++ /dev/null @@ -1,88 +0,0 @@ -- OS: Windows 11 -- CPU: AMD Ryzen 5 7600X -- Java: 17.0.7 - -```text -Benchmark (characters) (jsonSize) (maskedKeyProbability) (obfuscationLength) Mode Cnt Score Error Units -BaselineBenchmark.countBytes unicode 1kb 0.01 N/A thrpt 4275859.921 ops/s -BaselineBenchmark.countBytes unicode 128kb 0.01 N/A thrpt 34383.949 ops/s -BaselineBenchmark.countBytes unicode 2mb 0.01 N/A thrpt 2259.797 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 1kb 0.01 N/A thrpt 27694.585 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 128kb 0.01 N/A thrpt 164.931 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 2mb 0.01 N/A thrpt 7.827 ops/s -BaselineBenchmark.regexReplace unicode 1kb 0.01 N/A thrpt 26708.159 ops/s -BaselineBenchmark.regexReplace unicode 128kb 0.01 N/A thrpt 54.006 ops/s -BaselineBenchmark.regexReplace unicode 2mb 0.01 N/A thrpt 2.755 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 none thrpt 1792264.262 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 8 thrpt 1313944.059 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.1 none thrpt 1422404.439 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.1 8 thrpt 1305269.623 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 none thrpt 9573.676 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 8 thrpt 9119.066 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.1 none thrpt 7618.644 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.1 8 thrpt 7221.341 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 none thrpt 357.455 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 8 thrpt 338.745 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.1 none thrpt 284.223 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.1 8 thrpt 273.050 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 none thrpt 1858309.486 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 8 thrpt 1883325.143 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.1 none thrpt 1651683.564 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.1 8 thrpt 1490008.942 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 none thrpt 8877.256 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 8 thrpt 9245.834 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.1 none thrpt 7140.845 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.1 8 thrpt 7070.087 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 none thrpt 318.472 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 8 thrpt 294.401 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.1 none thrpt 260.596 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.1 8 thrpt 265.359 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 none thrpt 2138407.873 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 8 thrpt 2127804.081 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.1 none thrpt 1381401.814 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.1 8 thrpt 1384189.868 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 none thrpt 10542.554 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 8 thrpt 11424.885 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.1 none thrpt 8629.352 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.1 8 thrpt 8793.130 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 none thrpt 355.040 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 8 thrpt 368.212 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.1 none thrpt 321.465 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.1 8 thrpt 319.582 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 none thrpt 1470412.314 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 8 thrpt 1485375.977 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.1 none thrpt 1185281.574 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.1 8 thrpt 1231779.971 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 none thrpt 8046.371 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 8 thrpt 7803.398 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.1 none thrpt 6908.720 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.1 8 thrpt 6355.124 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 none thrpt 293.422 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 8 thrpt 290.657 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.1 none thrpt 243.733 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.1 8 thrpt 237.551 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 none thrpt 1355714.023 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 8 thrpt 1595173.224 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.1 none thrpt 1563292.350 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.1 8 thrpt 1082396.539 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 none thrpt 7069.302 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 8 thrpt 7414.311 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.1 none thrpt 5834.648 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.1 8 thrpt 6465.854 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 none thrpt 267.409 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 8 thrpt 257.608 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.1 none thrpt 227.994 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.1 8 thrpt 231.926 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 none thrpt 640918.545 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 8 thrpt 577299.783 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.1 none thrpt 460062.435 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.1 8 thrpt 515966.893 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 none thrpt 2366.147 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 8 thrpt 2425.744 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.1 none thrpt 2383.124 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.1 8 thrpt 2334.245 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 none thrpt 140.958 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 8 thrpt 142.609 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.1 none thrpt 138.359 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.1 8 thrpt 139.073 ops/s -``` \ No newline at end of file diff --git a/src/jmh/benchmark-history/2024-01-06.md b/src/jmh/benchmark-history/2024-01-06.md deleted file mode 100644 index 8d3ced99..00000000 --- a/src/jmh/benchmark-history/2024-01-06.md +++ /dev/null @@ -1,54 +0,0 @@ -- OS: MacOS 14.2.1 -- CPU: Apple Macbook Pro M1, 2020 -- Java: 17.0.8.1 - -```text -Benchmark (characters) (jsonSize) (maskedKeyProbability) Mode Cnt Score Error Units -BaselineBenchmark.countBytes unicode 1kb 0.01 thrpt 3315041,920 ops/s -BaselineBenchmark.countBytes unicode 128kb 0.01 thrpt 23936,353 ops/s -BaselineBenchmark.countBytes unicode 2mb 0.01 thrpt 1497,087 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 1kb 0.01 thrpt 16054,766 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 128kb 0.01 thrpt 104,061 ops/s -BaselineBenchmark.jacksonParseAndMask unicode 2mb 0.01 thrpt 5,798 ops/s -BaselineBenchmark.regexReplace unicode 1kb 0.01 thrpt 10196,652 ops/s -BaselineBenchmark.regexReplace unicode 128kb 0.01 thrpt 36,771 ops/s -BaselineBenchmark.regexReplace unicode 2mb 0.01 thrpt 3,745 ops/s - -Benchmark (characters) (jsonSize) (maskedKeyProbability) (obfuscationLength) Mode Cnt Score Error Units -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 none thrpt 1275748,423 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 1kb 0.01 8 thrpt 606406,633 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 none thrpt 5314,492 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 128kb 0.01 8 thrpt 4955,777 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 none thrpt 266,778 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii (no quote) 2mb 0.01 8 thrpt 256,606 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 none thrpt 1304404,790 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 1kb 0.01 8 thrpt 1001140,634 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 none thrpt 4977,300 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 128kb 0.01 8 thrpt 4717,618 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 none thrpt 252,588 ops/s -JsonMaskerBenchmark.jsonMaskerBytes ascii 2mb 0.01 8 thrpt 253,735 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 none thrpt 801846,357 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 1kb 0.01 8 thrpt 756732,784 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 none thrpt 5826,137 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 128kb 0.01 8 thrpt 5806,390 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 none thrpt 304,560 ops/s -JsonMaskerBenchmark.jsonMaskerBytes unicode 2mb 0.01 8 thrpt 303,330 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 none thrpt 1098978,310 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 1kb 0.01 8 thrpt 620607,943 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 none thrpt 4796,005 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 128kb 0.01 8 thrpt 4695,628 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 none thrpt 231,500 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii (no quote) 2mb 0.01 8 thrpt 223,366 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 none thrpt 1173345,541 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 1kb 0.01 8 thrpt 925435,460 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 none thrpt 4614,846 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 128kb 0.01 8 thrpt 4483,467 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 none thrpt 221,313 ops/s -JsonMaskerBenchmark.jsonMaskerString ascii 2mb 0.01 8 thrpt 220,232 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 none thrpt 372591,315 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 1kb 0.01 8 thrpt 447871,573 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 none thrpt 2203,442 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 128kb 0.01 8 thrpt 2195,156 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 none thrpt 129,351 ops/s -JsonMaskerBenchmark.jsonMaskerString unicode 2mb 0.01 8 thrpt 128,636 ops/s -``` \ No newline at end of file diff --git a/src/jmh/benchmark-history/README.md b/src/jmh/benchmark-history/README.md deleted file mode 100644 index 0d12302e..00000000 --- a/src/jmh/benchmark-history/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Benchmark history - -To prevent performance regressions, we keep track of changes in JMH benchmarks (10 s warmup, 10s average time) after each commit that could impact the performance of the masker. \ No newline at end of file diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/BaselineBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/BaselineBenchmark.java index afd6d20a..4700e453 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/BaselineBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/BaselineBenchmark.java @@ -25,9 +25,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) +@Measurement(iterations = 1) @OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class BaselineBenchmark { @@ -35,11 +35,11 @@ public class BaselineBenchmark { @org.openjdk.jmh.annotations.State(Scope.Thread) @NullUnmarked public static class State { - @Param({ "1kb", "128kb", "2mb" }) + @Param({ "1kb", "32kb", "1mb" }) String jsonSize; - @Param({ "ascii", "unicode" }) + @Param({ "unicode" }) String characters; - @Param({ "0.01" }) + @Param({ "0.1" }) double maskedKeyProbability; private Set targetKeys; @@ -50,7 +50,7 @@ public static class State { @Setup public synchronized void setup() { targetKeys = BenchmarkUtils.getTargetKeys(20); - jsonString = BenchmarkUtils.randomJson(targetKeys, jsonSize, characters, maskedKeyProbability); + jsonString = BenchmarkUtils.randomJson(targetKeys, jsonSize, characters, maskedKeyProbability).toString(); jsonBytes = jsonString.getBytes(StandardCharsets.UTF_8); regexList = targetKeys.stream() diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/BenchmarkUtils.java b/src/jmh/java/dev/blaauwendraad/masker/json/BenchmarkUtils.java index 89b38a28..2dfde4e7 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/BenchmarkUtils.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/BenchmarkUtils.java @@ -1,10 +1,17 @@ package dev.blaauwendraad.masker.json; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import dev.blaauwendraad.masker.json.path.JsonPathParser; import dev.blaauwendraad.masker.randomgen.RandomJsonGenerator; import dev.blaauwendraad.masker.randomgen.RandomJsonGeneratorConfig; -import java.util.HashSet; -import java.util.Set; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URL; +import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -15,6 +22,25 @@ public class BenchmarkUtils { + public static final long STATIC_RANDOM_SEED = 1285756302517652226L; + public static final int TARGET_KEYS_SIZE = 2385; + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + public static List loadSampleTargetKeys() { + try { + URL targetKeyFileUrl = RandomJsonGenerator.class.getResource("/target_keys.json"); + List targetKeyList = new ArrayList<>(); + BenchmarkUtils.OBJECT_MAPPER.readValue(targetKeyFileUrl, ArrayNode.class).forEach(t -> targetKeyList.add(t.textValue())); + + if (targetKeyList.size() != BenchmarkUtils.TARGET_KEYS_SIZE) { + throw new IllegalArgumentException("Number of keys does not match, please adjust the constant"); + } + return targetKeyList; + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + public static int parseSize(String size) { // use regex to parse the jsonSize param Pattern pattern = Pattern.compile("^(\\d+)(\\w+)$"); @@ -45,7 +71,7 @@ public static Set getTargetKeys(int count) { return targetKeys; } - public static String randomJson(Set targetKeys, String jsonSize, String characters, double targetKeyPercentage) { + public static JsonNode randomJson(Set targetKeys, String jsonSize, String characters, double targetKeyPercentage) { Set allowedCharacters = switch (characters) { case "ascii (no quote)" -> getPrintableAsciiCharacters() .stream() @@ -64,9 +90,67 @@ public static String randomJson(Set targetKeys, String jsonSize, String .setTargetKeys(targetKeys) .setTargetKeyPercentage(targetKeyPercentage) .setTargetJsonSizeBytes(BenchmarkUtils.parseSize(jsonSize)) - .setRandomSeed(RandomJsonGenerator.STATIC_RANDOM_SEED) + .setRandomSeed(STATIC_RANDOM_SEED) .createConfig(); - return new RandomJsonGenerator(config).createRandomJsonNode().toString(); + JsonNode jsonNode = new RandomJsonGenerator(config).createRandomJsonNode(); + Set jsonPaths = new HashSet<>(); + Set lowerCaseTargetKeys = targetKeys.stream().map(String::toLowerCase).collect(Collectors.toSet()); + collectJsonPaths(jsonNode, jsonPaths, "$", lowerCaseTargetKeys); + return jsonNode; + } + + private static void collectJsonPaths(JsonNode jsonNode, Set jsonPaths, String currentJsonPath, Set targetKeys) { + if (jsonNode instanceof ObjectNode objectNode) { + Iterable fieldNames = objectNode::fieldNames; + for (String fieldName : fieldNames) { + if (fieldName.isEmpty() || fieldName.startsWith(".") || fieldName.endsWith(".") || fieldName.contains("..")) { + // such filed would result in descendant segment '..' that we don't support + continue; + } + String jsonPathKey = currentJsonPath + "." + fieldName; + if (targetKeys.contains(fieldName.toLowerCase())) { + jsonPaths.add(jsonPathKey); + } + collectJsonPaths(jsonNode.get(fieldName), jsonPaths, jsonPathKey, targetKeys); + } + } else if (jsonNode instanceof ArrayNode arrayNode) { + String jsonPathKey = currentJsonPath + "[*]"; + for (int i = 0; i < arrayNode.size(); i++) { + collectJsonPaths(arrayNode.get(i), jsonPaths, jsonPathKey, targetKeys); + } + } + } + + public static Set collectJsonPaths(JsonNode jsonNode, Set targetKeys) { + Set jsonPaths = new HashSet<>(); + Set lowerCaseTargetKeys = targetKeys.stream().map(String::toLowerCase).collect(Collectors.toSet()); + collectJsonPaths(jsonNode, jsonPaths, "$", lowerCaseTargetKeys); + return disambiguate(jsonPaths); + } + + /** + * Disambiguates the input list of jsonpath keys. + *

+ * If two keys $.a.b and $.a are present, the more specific $.a.b will be chosen. + * + * @param jsonPaths the input list of jsonpath keys + * @return disambiguated set of jsonpath keys + */ + public static Set disambiguate(Set jsonPaths) { + List jsonPathKeys = new ArrayList<>(jsonPaths); + Collections.sort(jsonPathKeys); + JsonPathParser jsonPathParser = new JsonPathParser(); + for (int i = 1; i < jsonPathKeys.size(); i++) { + String current = jsonPathKeys.get(i - 1); + String next = jsonPathKeys.get(i); + try { + jsonPathParser.checkAmbiguity(Set.of(jsonPathParser.parse(current), jsonPathParser.parse(next))); + } catch (IllegalArgumentException ignore) { + jsonPathKeys.remove(next); + i--; + } + } + return new HashSet<>(jsonPathKeys); } } diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/InstanceCreationBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/InstanceCreationBenchmark.java index 4b47783c..52a22a76 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/InstanceCreationBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/InstanceCreationBenchmark.java @@ -1,10 +1,5 @@ package dev.blaauwendraad.masker.json; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; - -import dev.blaauwendraad.masker.randomgen.RandomJsonGenerator; - import org.jspecify.annotations.NullUnmarked; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -17,43 +12,37 @@ import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.Warmup; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) - @OutputTimeUnit(TimeUnit.SECONDS) +@Measurement(iterations = 1) +@OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class InstanceCreationBenchmark { - private static final ObjectMapper objectMapper = new ObjectMapper(); @org.openjdk.jmh.annotations.State(Scope.Thread) @NullUnmarked public static class State { - @Param({"1", "10", "100", "ALL"}) - String numberOfTargetKeys; + @Param({"10", "500", "" + BenchmarkUtils.TARGET_KEYS_SIZE}) + int numberOfTargetKeys; Set targetKeys; @Setup - public synchronized void setup() throws IOException { - URL targetKeyFileUrl = RandomJsonGenerator.class.getResource("/target_keys.json"); - List targetKeyList = new ArrayList<>(); - objectMapper.readValue(targetKeyFileUrl, ArrayNode.class).forEach(t -> targetKeyList.add(t.textValue())); - if (!"ALL".equals(numberOfTargetKeys) && Integer.parseInt(numberOfTargetKeys) <= targetKeyList.size()) { - Collections.shuffle(targetKeyList, new Random(RandomJsonGenerator.STATIC_RANDOM_SEED)); - targetKeys = - targetKeyList.stream().limit(Integer.parseInt(numberOfTargetKeys)).collect(Collectors.toSet()); + public synchronized void setup() { + List targetKeyList = BenchmarkUtils.loadSampleTargetKeys(); + if (numberOfTargetKeys <= targetKeyList.size()) { + Collections.shuffle(targetKeyList, new Random(BenchmarkUtils.STATIC_RANDOM_SEED)); + targetKeys = targetKeyList.stream().limit(numberOfTargetKeys).collect(Collectors.toSet()); } else { - targetKeys = targetKeyList.stream().collect(Collectors.toSet()); + targetKeys = new HashSet<>(targetKeyList); } } } diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java index 3e8862f0..96a02f3d 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark.java @@ -1,5 +1,6 @@ package dev.blaauwendraad.masker.json; +import com.fasterxml.jackson.databind.JsonNode; import dev.blaauwendraad.masker.json.config.JsonMaskingConfig; import org.jspecify.annotations.NullUnmarked; import org.openjdk.jmh.annotations.Benchmark; @@ -12,7 +13,6 @@ import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.Warmup; -import dev.blaauwendraad.masker.json.util.JsonPathTestUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -20,9 +20,9 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) +@Measurement(iterations = 1) @OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class JsonMaskerBenchmark { @@ -30,11 +30,11 @@ public class JsonMaskerBenchmark { @org.openjdk.jmh.annotations.State(Scope.Thread) @NullUnmarked public static class State { - @Param({ "1kb", "128kb", "2mb" }) + @Param({ "1kb", "32kb", "1mb" }) String jsonSize; - @Param({ "ascii", "unicode" }) + @Param({ "unicode" }) String characters; - @Param({ "0.01", "0.1" }) + @Param({ "0.1" }) double maskedKeyProbability; @Param({ "false", "true" }) boolean jsonPath; @@ -46,12 +46,13 @@ public static class State { @Setup public synchronized void setup() { Set targetKeys = BenchmarkUtils.getTargetKeys(20); - jsonString = BenchmarkUtils.randomJson(targetKeys, jsonSize, characters, maskedKeyProbability); + JsonNode randomJson = BenchmarkUtils.randomJson(targetKeys, jsonSize, characters, maskedKeyProbability); + jsonString = randomJson.toString(); jsonBytes = jsonString.getBytes(StandardCharsets.UTF_8); JsonMaskingConfig.Builder builder = JsonMaskingConfig.builder(); if (jsonPath) { - builder.maskJsonPaths(JsonPathTestUtils.transformToJsonPathKeys(targetKeys, jsonString)); + builder.maskJsonPaths(BenchmarkUtils.collectJsonPaths(randomJson, targetKeys)); } else { builder.maskKeys(targetKeys); } diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark_no_streaming.java b/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark_no_streaming.java new file mode 100644 index 00000000..9f2aaf91 --- /dev/null +++ b/src/jmh/java/dev/blaauwendraad/masker/json/JsonMaskerBenchmark_no_streaming.java @@ -0,0 +1,70 @@ +package dev.blaauwendraad.masker.json; + +import com.fasterxml.jackson.databind.JsonNode; +import dev.blaauwendraad.masker.json.config.JsonMaskingConfig; +import org.jspecify.annotations.NullUnmarked; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.Warmup; + +import java.nio.charset.StandardCharsets; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 1, time = 3) +@Fork(value = 1) +@Measurement(iterations = 1, time = 3) +@OutputTimeUnit(TimeUnit.SECONDS) +@BenchmarkMode(Mode.Throughput) +public class JsonMaskerBenchmark { + + @org.openjdk.jmh.annotations.State(Scope.Thread) + @NullUnmarked + public static class State { + @Param({ "1kb", "32kb", "1mb" }) + String jsonSize; + @Param({ "unicode" }) + String characters; + @Param({ "0.1" }) + double maskedKeyProbability; + @Param({ "false", "true" }) + boolean jsonPath; + + private String jsonString; + private byte[] jsonBytes; + private JsonMasker jsonMasker; + + @Setup + public synchronized void setup() { + Set targetKeys = BenchmarkUtils.getTargetKeys(20); + JsonNode randomJson = BenchmarkUtils.randomJson(targetKeys, jsonSize, characters, maskedKeyProbability); + jsonString = randomJson.toString(); + jsonBytes = jsonString.getBytes(StandardCharsets.UTF_8); + + JsonMaskingConfig.Builder builder = JsonMaskingConfig.builder(); + if (jsonPath) { + builder.maskJsonPaths(BenchmarkUtils.collectJsonPaths(randomJson, targetKeys)); + } else { + builder.maskKeys(targetKeys); + } + jsonMasker = JsonMasker.getMasker(builder.build()); + } + } + + @Benchmark + public String jsonMaskerString(State state) { + return state.jsonMasker.mask(state.jsonString); + } + + @Benchmark + public byte[] jsonMaskerBytes(State state) { + return state.jsonMasker.mask(state.jsonBytes); + } +} diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/KeyMatcherBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/KeyMatcherBenchmark.java new file mode 100644 index 00000000..0b91a5f2 --- /dev/null +++ b/src/jmh/java/dev/blaauwendraad/masker/json/KeyMatcherBenchmark.java @@ -0,0 +1,70 @@ +package dev.blaauwendraad.masker.json; + +import dev.blaauwendraad.masker.json.config.JsonMaskingConfig; +import org.jspecify.annotations.NullUnmarked; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 1) +@Fork(value = 1) +@Measurement(iterations = 1) +@OutputTimeUnit(TimeUnit.SECONDS) +@BenchmarkMode(Mode.Throughput) +public class KeyMatcherBenchmark { + + @org.openjdk.jmh.annotations.State(Scope.Thread) + @NullUnmarked + public static class State { + + List targetKeys; + List targetKeysBytes; + KeyMatcher keyMatcher; + @Param({ "false", "true" }) + boolean caseSensitive; + @Param({ "mask", "allow" }) + String mode; + + @Setup + public synchronized void setup() throws IOException { + targetKeys = BenchmarkUtils.loadSampleTargetKeys(); + + targetKeysBytes = targetKeys.stream().map(key -> key.getBytes(StandardCharsets.UTF_8)).toList(); + + var builder = JsonMaskingConfig.builder(); + if (caseSensitive) { + builder.caseSensitiveTargetKeys(); + } + if (mode.equals("allow")) { + builder.allowKeys(new HashSet<>(targetKeys)); + } else { + builder.maskKeys(new HashSet<>(targetKeys)); + } + keyMatcher = new KeyMatcher(builder.build()); + } + } + + @Benchmark + @OperationsPerInvocation(BenchmarkUtils.TARGET_KEYS_SIZE) + public void matchAllKeys(Blackhole bh, State state) { + for (byte[] targetKey : state.targetKeysBytes) { + var config = state.keyMatcher.getMaskConfigIfMatched(targetKey, 0, targetKey.length, null); + bh.consume(config); + } + } +} diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/LargeKeySetInstanceCreationBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/LargeKeySetInstanceCreationBenchmark.java index 20896542..1bab10fc 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/LargeKeySetInstanceCreationBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/LargeKeySetInstanceCreationBenchmark.java @@ -22,17 +22,17 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) - @OutputTimeUnit(TimeUnit.SECONDS) +@Measurement(iterations = 1) +@OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class LargeKeySetInstanceCreationBenchmark { @org.openjdk.jmh.annotations.State(Scope.Thread) @NullUnmarked public static class State { - @Param({"1", "100", "1000", "10000"}) + @Param({"100", "1000", "10000"}) int numberOfTargetKeys; @Param({"10", "100", "1000"}) @@ -42,7 +42,7 @@ public static class State { @Setup public synchronized void setup() throws IOException { - Random random = new Random(RandomJsonGenerator.STATIC_RANDOM_SEED); + Random random = new Random(BenchmarkUtils.STATIC_RANDOM_SEED); List characters = JsonStringCharacters.mergeCharSets( JsonStringCharacters.getPrintableAsciiCharacters(), diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/StreamTypeBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/StreamTypeBenchmark.java index 65d2289a..6fd2c0ab 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/StreamTypeBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/StreamTypeBenchmark.java @@ -1,7 +1,7 @@ package dev.blaauwendraad.masker.json; +import com.fasterxml.jackson.databind.JsonNode; import dev.blaauwendraad.masker.json.config.JsonMaskingConfig; -import dev.blaauwendraad.masker.json.util.JsonPathTestUtils; import org.jspecify.annotations.NullUnmarked; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -29,9 +29,9 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) +@Measurement(iterations = 1) @OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class StreamTypeBenchmark { @@ -57,7 +57,8 @@ public static class State { public synchronized void setup() throws IOException { // prepare a json Set targetKeys = BenchmarkUtils.getTargetKeys(20); - json = BenchmarkUtils.randomJson(targetKeys, jsonSize, "unicode", 0.1).getBytes(StandardCharsets.UTF_8); + JsonNode jsonNode = BenchmarkUtils.randomJson(targetKeys, jsonSize, "unicode", 0.1); + json = jsonNode.toString().getBytes(StandardCharsets.UTF_8); // prepare an input file for FileStreams try (FileWriter inputFileWriter = new FileWriter(INPUT_FILE_STREAM_NAME)) { @@ -67,7 +68,7 @@ public synchronized void setup() throws IOException { // create a masker JsonMaskingConfig.Builder builder = JsonMaskingConfig.builder(); - builder.maskJsonPaths(JsonPathTestUtils.transformToJsonPathKeys(targetKeys, new String(json, StandardCharsets.UTF_8))); + builder.maskJsonPaths(BenchmarkUtils.collectJsonPaths(jsonNode, targetKeys)); jsonMasker = JsonMasker.getMasker(builder.build()); } diff --git a/src/jmh/java/dev/blaauwendraad/masker/json/ValueMaskerBenchmark.java b/src/jmh/java/dev/blaauwendraad/masker/json/ValueMaskerBenchmark.java index 82296b66..c31d03f0 100644 --- a/src/jmh/java/dev/blaauwendraad/masker/json/ValueMaskerBenchmark.java +++ b/src/jmh/java/dev/blaauwendraad/masker/json/ValueMaskerBenchmark.java @@ -1,5 +1,6 @@ package dev.blaauwendraad.masker.json; +import com.fasterxml.jackson.databind.JsonNode; import dev.blaauwendraad.masker.json.config.JsonMaskingConfig; import org.jspecify.annotations.NullUnmarked; import org.openjdk.jmh.annotations.Benchmark; @@ -17,9 +18,9 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -@Warmup(iterations = 1, time = 3) +@Warmup(iterations = 1) @Fork(value = 1) -@Measurement(iterations = 1, time = 3) +@Measurement(iterations = 1) @OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Mode.Throughput) public class ValueMaskerBenchmark { @@ -28,8 +29,7 @@ public class ValueMaskerBenchmark { @org.openjdk.jmh.annotations.State(Scope.Thread) @NullUnmarked public static class State { - - @Param({ "1kb", "128kb" }) + @Param({ "1kb", "32kb", "1mb" }) String jsonSize; @Param({ "unicode" }) String characters; @@ -37,12 +37,12 @@ public static class State { double maskedKeyProbability; private final JsonMasker nativeMasker = JsonMasker.getMasker(JsonMaskingConfig.builder() - .maskKeys("targetKey") + .maskKeys(Set.of("targetKey")) .build() ); private final JsonMasker rawValueMasker = JsonMasker.getMasker(JsonMaskingConfig.builder() - .maskKeys("targetKey") + .maskKeys(Set.of("targetKey")) .maskStringsWith(ValueMaskers.withRawValueFunction(value -> "\"***\"")) .maskNumbersWith(ValueMaskers.withRawValueFunction(value -> "\"###\"")) .maskBooleansWith(ValueMaskers.withRawValueFunction(value -> "\"&&&\"")) @@ -50,7 +50,7 @@ public static class State { ); private final JsonMasker textValueMasker = JsonMasker.getMasker(JsonMaskingConfig.builder() - .maskKeys("targetKey") + .maskKeys(Set.of("targetKey")) .maskStringsWith(ValueMaskers.withTextFunction(value -> "***")) .maskNumbersWith(ValueMaskers.withTextFunction(value -> "###")) .maskBooleansWith(ValueMaskers.withTextFunction(value -> "&&&")) @@ -61,8 +61,8 @@ public static class State { @Setup public synchronized void setup() { - String jsonString = BenchmarkUtils.randomJson(Set.of("targetKey"), jsonSize, characters, maskedKeyProbability); - jsonBytes = jsonString.getBytes(StandardCharsets.UTF_8); + JsonNode jsonNode = BenchmarkUtils.randomJson(Set.of("targetKey"), jsonSize, characters, maskedKeyProbability); + jsonBytes = jsonNode.toString().getBytes(StandardCharsets.UTF_8); } } diff --git a/src/jmh/resources/target_keys.json b/src/jmh/resources/target_keys.json new file mode 100644 index 00000000..5292da4c --- /dev/null +++ b/src/jmh/resources/target_keys.json @@ -0,0 +1,2387 @@ +[ + "2fa", + "2FA", + "2fa_code", + "2faCode", + "2facode", + "2FACODE", + "2fa code", + "2fa_pin", + "2faPin", + "2fapin", + "2FAPIN", + "2fa pin", + "2fa_token", + "2faToken", + "2fatoken", + "2FATOKEN", + "2fa token", + "_csrf", + "Csrf", + "csrf", + "CSRF", + "Acc_number", + "accNumber", + "accnumber", + "ACCNUMBER", + "acc_number", + "Acc number", + "Access_token", + "accessToken", + "accesstoken", + "ACCESSTOKEN", + "access_token", + "Access token", + "Account_bank_number", + "accountBankNumber", + "accountbanknumber", + "ACCOUNTBANKNUMBER", + "account_bank_number", + "Account bank number", + "Account_number", + "accountNumber", + "accountnumber", + "ACCOUNTNUMBER", + "account_number", + "Account number", + "Account_routing_number", + "accountRoutingNumber", + "accountroutingnumber", + "ACCOUNTROUTINGNUMBER", + "account_routing_number", + "Account routing number", + "Api_key", + "apiKey", + "apikey", + "APIKEY", + "api_key", + "Api key", + "Api_token", + "apiToken", + "apitoken", + "APITOKEN", + "api_token", + "Api token", + "Auth_token", + "authToken", + "authtoken", + "AUTHTOKEN", + "auth_token", + "Auth token", + "Bank_acc", + "bankAcc", + "bankacc", + "BANKACC", + "bank_acc", + "Bank acc", + "Bank_acc[routing_num]", + "bankAcc[routingNum]", + "bankacc[routingnum]", + "BANKACC[ROUTINGNUM]", + "bank_acc[routing_num]", + "Bank acc[routing num]", + "Bank_acc[routing_number]", + "bankAcc[routingNumber]", + "bankacc[routingnumber]", + "BANKACC[ROUTINGNUMBER]", + "bank_acc[routing_number]", + "Bank acc[routing number]", + "Bank_acc_num", + "bankAccNum", + "bankaccnum", + "BANKACCNUM", + "bank_acc_num", + "Bank acc num", + "Bank_acc_number", + "bankAccNumber", + "bankaccnumber", + "BANKACCNUMBER", + "bank_acc_number", + "Bank acc number", + "Bank_account", + "bankAccount", + "bankaccount", + "BANKACCOUNT", + "bank_account", + "Bank account", + "Bank_account[routing_number]", + "bankAccount[routingNumber]", + "bankaccount[routingnumber]", + "BANKACCOUNT[ROUTINGNUMBER]", + "bank_account[routing_number]", + "Bank account[routing number]", + "Bank_account_num", + "bankAccountNum", + "bankaccountnum", + "BANKACCOUNTNUM", + "bank_account_num", + "Bank account num", + "Bank_account_number", + "bankAccountNumber", + "bankaccountnumber", + "BANKACCOUNTNUMBER", + "bank_account_number", + "Bank account number", + "Card[cvv]", + "card[cvv]", + "CARD[CVV]", + "Card[num]", + "card[num]", + "CARD[NUM]", + "Card[number]", + "card[number]", + "CARD[NUMBER]", + "Card_cvv", + "cardCvv", + "cardcvv", + "CARDCVV", + "card_cvv", + "Card cvv", + "Card_num", + "cardNum", + "cardnum", + "CARDNUM", + "card_num", + "Card num", + "Card_number", + "cardNumber", + "cardnumber", + "CARDNUMBER", + "card_number", + "Card number", + "Cc_num", + "ccNum", + "ccnum", + "CCNUM", + "cc_num", + "Cc num", + "Cc_number", + "ccNumber", + "ccnumber", + "CCNUMBER", + "cc_number", + "Cc number", + "Cert", + "cert", + "CERT", + "Certificate", + "certificate", + "CERTIFICATE", + "Confirm_passwd", + "confirmPasswd", + "confirmpasswd", + "CONFIRMPASSWD", + "confirm_passwd", + "Confirm passwd", + "Confirm_password", + "confirmPassword", + "confirmpassword", + "CONFIRMPASSWORD", + "confirm_password", + "Confirm password", + "Credentials", + "credentials", + "CREDENTIALS", + "Credit_card", + "creditCard", + "creditcard", + "CREDITCARD", + "credit_card", + "Credit card", + "Credit_card_num", + "creditCardNum", + "creditcardnum", + "CREDITCARDNUM", + "credit_card_num", + "Credit card num", + "Credit_card_number", + "creditCardNumber", + "creditcardnumber", + "CREDITCARDNUMBER", + "credit_card_number", + "Credit card number", + "Creds", + "creds", + "CREDS", + "Cvv", + "cvv", + "CVV", + "Issuer_certificate", + "issuerCertificate", + "issuercertificate", + "ISSUERCERTIFICATE", + "issuer_certificate", + "Issuer certificate", + "Key", + "key", + "KEY", + "Mysql_pwd", + "mysqlPwd", + "mysqlpwd", + "MYSQLPWD", + "mysql_pwd", + "Mysql pwd", + "New_password", + "newPassword", + "newpassword", + "NEWPASSWORD", + "new_password", + "New password", + "Old_password", + "oldPassword", + "oldpassword", + "OLDPASSWORD", + "old_password", + "Old password", + "Otp", + "otp", + "OTP", + "Otp_code", + "otpCode", + "otpcode", + "OTPCODE", + "otp_code", + "Otp code", + "Otp_pin", + "otpPin", + "otppin", + "OTPPIN", + "otp_pin", + "Otp pin", + "Otp_token", + "otpToken", + "otptoken", + "OTPTOKEN", + "otp_token", + "Otp token", + "Passwd", + "passwd", + "PASSWD", + "Passwd_confirm", + "passwdConfirm", + "passwdconfirm", + "PASSWDCONFIRM", + "passwd_confirm", + "Passwd confirm", + "Password", + "password", + "PASSWORD", + "Password1", + "password1", + "PASSWORD1", + "Password2", + "password2", + "PASSWORD2", + "Password_confirm", + "passwordConfirm", + "passwordconfirm", + "PASSWORDCONFIRM", + "password_confirm", + "Password confirm", + "Pin", + "pin", + "PIN", + "Private_key", + "privateKey", + "privatekey", + "PRIVATEKEY", + "private_key", + "Private key", + "Pwd", + "pwd", + "PWD", + "Raw", + "raw", + "RAW", + "Repeat_password", + "repeatPassword", + "repeatpassword", + "REPEATPASSWORD", + "repeat_password", + "Repeat password", + "Routing_acc", + "routingAcc", + "routingacc", + "ROUTINGACC", + "routing_acc", + "Routing acc", + "Routing_acc_num", + "routingAccNum", + "routingaccnum", + "ROUTINGACCNUM", + "routing_acc_num", + "Routing acc num", + "Routing_acc_number", + "routingAccNumber", + "routingaccnumber", + "ROUTINGACCNUMBER", + "routing_acc_number", + "Routing acc number", + "Routing_account_number", + "routingAccountNumber", + "routingaccountnumber", + "ROUTINGACCOUNTNUMBER", + "routing_account_number", + "Routing account number", + "Routing_number", + "routingNumber", + "routingnumber", + "ROUTINGNUMBER", + "routing_number", + "Routing number", + "Salt", + "salt", + "SALT", + "Secret", + "secret", + "SECRET", + "Security_code", + "securityCode", + "securitycode", + "SECURITYCODE", + "security_code", + "Security code", + "Security_pin", + "securityPin", + "securitypin", + "SECURITYPIN", + "security_pin", + "Security pin", + "Security_token", + "securityToken", + "securitytoken", + "SECURITYTOKEN", + "security_token", + "Security token", + "Social_security_num", + "socialSecurityNum", + "socialsecuritynum", + "SOCIALSECURITYNUM", + "social_security_num", + "Social security num", + "Social_security_number", + "socialSecurityNumber", + "socialsecuritynumber", + "SOCIALSECURITYNUMBER", + "social_security_number", + "Social security number", + "Ssn", + "ssn", + "SSN", + "Stripe_token", + "stripeToken", + "stripetoken", + "STRIPETOKEN", + "stripe_token", + "Stripe token", + "Token", + "token", + "TOKEN", + "Totp", + "totp", + "TOTP", + "Totp_code", + "totpCode", + "totpcode", + "TOTPCODE", + "totp_code", + "Totp code", + "Totp_pin", + "totpPin", + "totppin", + "TOTPPIN", + "totp_pin", + "Totp pin", + "Totp_token", + "totpToken", + "totptoken", + "TOTPTOKEN", + "totp_token", + "Totp token", + "Two_factor_code", + "twoFactorCode", + "twofactorcode", + "TWOFACTORCODE", + "two_factor_code", + "Two factor code", + "Two_factor_pin", + "twoFactorPin", + "twofactorpin", + "TWOFACTORPIN", + "two_factor_pin", + "Two factor pin", + "Two_factor_token", + "twoFactorToken", + "twofactortoken", + "TWOFACTORTOKEN", + "two_factor_token", + "Two factor token", + "Field_2fa", + "field2fa", + "FIELD2FA", + "field_2fa", + "Field 2fa", + "2fa_field", + "2faField", + "2fafield", + "2FAFIELD", + "2fa field", + "Input_2fa", + "input2fa", + "INPUT2FA", + "input_2fa", + "Input 2fa", + "2fa_input", + "2faInput", + "2fainput", + "2FAINPUT", + "2fa input", + "Field_2fa_code", + "field2faCode", + "field2facode", + "FIELD2FACODE", + "field_2fa_code", + "Field 2fa code", + "2fa_code_field", + "2faCodeField", + "2facodefield", + "2FACODEFIELD", + "2fa code field", + "Input_2fa_code", + "input2faCode", + "input2facode", + "INPUT2FACODE", + "input_2fa_code", + "Input 2fa code", + "2fa_code_input", + "2faCodeInput", + "2facodeinput", + "2FACODEINPUT", + "2fa code input", + "Field_2fa_pin", + "field2faPin", + "field2fapin", + "FIELD2FAPIN", + "field_2fa_pin", + "Field 2fa pin", + "2fa_pin_field", + "2faPinField", + "2fapinfield", + "2FAPINFIELD", + "2fa pin field", + "Input_2fa_pin", + "input2faPin", + "input2fapin", + "INPUT2FAPIN", + "input_2fa_pin", + "Input 2fa pin", + "2fa_pin_input", + "2faPinInput", + "2fapininput", + "2FAPININPUT", + "2fa pin input", + "Field_2fa_token", + "field2faToken", + "field2fatoken", + "FIELD2FATOKEN", + "field_2fa_token", + "Field 2fa token", + "2fa_token_field", + "2faTokenField", + "2fatokenfield", + "2FATOKENFIELD", + "2fa token field", + "Input_2fa_token", + "input2faToken", + "input2fatoken", + "INPUT2FATOKEN", + "input_2fa_token", + "Input 2fa token", + "2fa_token_input", + "2faTokenInput", + "2fatokeninput", + "2FATOKENINPUT", + "2fa token input", + "Field__csrf", + "fieldCsrf", + "fieldcsrf", + "FIELDCSRF", + "field__csrf", + "Field csrf", + "_csrf_field", + "CsrfField", + "csrffield", + "CSRFFIELD", + "Csrf field", + "Input__csrf", + "inputCsrf", + "inputcsrf", + "INPUTCSRF", + "input__csrf", + "Input csrf", + "_csrf_input", + "CsrfInput", + "csrfinput", + "CSRFINPUT", + "Csrf input", + "Field_acc_number", + "fieldAccNumber", + "fieldaccnumber", + "FIELDACCNUMBER", + "field_acc_number", + "Field acc number", + "Acc_number_field", + "accNumberField", + "accnumberfield", + "ACCNUMBERFIELD", + "acc_number_field", + "Acc number field", + "Input_acc_number", + "inputAccNumber", + "inputaccnumber", + "INPUTACCNUMBER", + "input_acc_number", + "Input acc number", + "Acc_number_input", + "accNumberInput", + "accnumberinput", + "ACCNUMBERINPUT", + "acc_number_input", + "Acc number input", + "Field_access_token", + "fieldAccessToken", + "fieldaccesstoken", + "FIELDACCESSTOKEN", + "field_access_token", + "Field access token", + "Access_token_field", + "accessTokenField", + "accesstokenfield", + "ACCESSTOKENFIELD", + "access_token_field", + "Access token field", + "Input_access_token", + "inputAccessToken", + "inputaccesstoken", + "INPUTACCESSTOKEN", + "input_access_token", + "Input access token", + "Access_token_input", + "accessTokenInput", + "accesstokeninput", + "ACCESSTOKENINPUT", + "access_token_input", + "Access token input", + "Field_account_bank_number", + "fieldAccountBankNumber", + "fieldaccountbanknumber", + "FIELDACCOUNTBANKNUMBER", + "field_account_bank_number", + "Field account bank number", + "Account_bank_number_field", + "accountBankNumberField", + "accountbanknumberfield", + "ACCOUNTBANKNUMBERFIELD", + "account_bank_number_field", + "Account bank number field", + "Input_account_bank_number", + "inputAccountBankNumber", + "inputaccountbanknumber", + "INPUTACCOUNTBANKNUMBER", + "input_account_bank_number", + "Input account bank number", + "Account_bank_number_input", + "accountBankNumberInput", + "accountbanknumberinput", + "ACCOUNTBANKNUMBERINPUT", + "account_bank_number_input", + "Account bank number input", + "Field_account_number", + "fieldAccountNumber", + "fieldaccountnumber", + "FIELDACCOUNTNUMBER", + "field_account_number", + "Field account number", + "Account_number_field", + "accountNumberField", + "accountnumberfield", + "ACCOUNTNUMBERFIELD", + "account_number_field", + "Account number field", + "Input_account_number", + "inputAccountNumber", + "inputaccountnumber", + "INPUTACCOUNTNUMBER", + "input_account_number", + "Input account number", + "Account_number_input", + "accountNumberInput", + "accountnumberinput", + "ACCOUNTNUMBERINPUT", + "account_number_input", + "Account number input", + "Field_account_routing_number", + "fieldAccountRoutingNumber", + "fieldaccountroutingnumber", + "FIELDACCOUNTROUTINGNUMBER", + "field_account_routing_number", + "Field account routing number", + "Account_routing_number_field", + "accountRoutingNumberField", + "accountroutingnumberfield", + "ACCOUNTROUTINGNUMBERFIELD", + "account_routing_number_field", + "Account routing number field", + "Input_account_routing_number", + "inputAccountRoutingNumber", + "inputaccountroutingnumber", + "INPUTACCOUNTROUTINGNUMBER", + "input_account_routing_number", + "Input account routing number", + "Account_routing_number_input", + "accountRoutingNumberInput", + "accountroutingnumberinput", + "ACCOUNTROUTINGNUMBERINPUT", + "account_routing_number_input", + "Account routing number input", + "Field_api_key", + "fieldApiKey", + "fieldapikey", + "FIELDAPIKEY", + "field_api_key", + "Field api key", + "Api_key_field", + "apiKeyField", + "apikeyfield", + "APIKEYFIELD", + "api_key_field", + "Api key field", + "Input_api_key", + "inputApiKey", + "inputapikey", + "INPUTAPIKEY", + "input_api_key", + "Input api key", + "Api_key_input", + "apiKeyInput", + "apikeyinput", + "APIKEYINPUT", + "api_key_input", + "Api key input", + "Field_api_token", + "fieldApiToken", + "fieldapitoken", + "FIELDAPITOKEN", + "field_api_token", + "Field api token", + "Api_token_field", + "apiTokenField", + "apitokenfield", + "APITOKENFIELD", + "api_token_field", + "Api token field", + "Input_api_token", + "inputApiToken", + "inputapitoken", + "INPUTAPITOKEN", + "input_api_token", + "Input api token", + "Api_token_input", + "apiTokenInput", + "apitokeninput", + "APITOKENINPUT", + "api_token_input", + "Api token input", + "Field_auth_token", + "fieldAuthToken", + "fieldauthtoken", + "FIELDAUTHTOKEN", + "field_auth_token", + "Field auth token", + "Auth_token_field", + "authTokenField", + "authtokenfield", + "AUTHTOKENFIELD", + "auth_token_field", + "Auth token field", + "Input_auth_token", + "inputAuthToken", + "inputauthtoken", + "INPUTAUTHTOKEN", + "input_auth_token", + "Input auth token", + "Auth_token_input", + "authTokenInput", + "authtokeninput", + "AUTHTOKENINPUT", + "auth_token_input", + "Auth token input", + "Field_bank_acc", + "fieldBankAcc", + "fieldbankacc", + "FIELDBANKACC", + "field_bank_acc", + "Field bank acc", + "Bank_acc_field", + "bankAccField", + "bankaccfield", + "BANKACCFIELD", + "bank_acc_field", + "Bank acc field", + "Input_bank_acc", + "inputBankAcc", + "inputbankacc", + "INPUTBANKACC", + "input_bank_acc", + "Input bank acc", + "Bank_acc_input", + "bankAccInput", + "bankaccinput", + "BANKACCINPUT", + "bank_acc_input", + "Bank acc input", + "Field_bank_acc[routing_num]", + "fieldBankAcc[routingNum]", + "fieldbankacc[routingnum]", + "FIELDBANKACC[ROUTINGNUM]", + "field_bank_acc[routing_num]", + "Field bank acc[routing num]", + "Bank_acc[routing_num]_field", + "bankAcc[routingNum]Field", + "bankacc[routingnum]field", + "BANKACC[ROUTINGNUM]FIELD", + "bank_acc[routing_num]_field", + "Bank acc[routing num] field", + "Input_bank_acc[routing_num]", + "inputBankAcc[routingNum]", + "inputbankacc[routingnum]", + "INPUTBANKACC[ROUTINGNUM]", + "input_bank_acc[routing_num]", + "Input bank acc[routing num]", + "Bank_acc[routing_num]_input", + "bankAcc[routingNum]Input", + "bankacc[routingnum]input", + "BANKACC[ROUTINGNUM]INPUT", + "bank_acc[routing_num]_input", + "Bank acc[routing num] input", + "Field_bank_acc[routing_number]", + "fieldBankAcc[routingNumber]", + "fieldbankacc[routingnumber]", + "FIELDBANKACC[ROUTINGNUMBER]", + "field_bank_acc[routing_number]", + "Field bank acc[routing number]", + "Bank_acc[routing_number]_field", + "bankAcc[routingNumber]Field", + "bankacc[routingnumber]field", + "BANKACC[ROUTINGNUMBER]FIELD", + "bank_acc[routing_number]_field", + "Bank acc[routing number] field", + "Input_bank_acc[routing_number]", + "inputBankAcc[routingNumber]", + "inputbankacc[routingnumber]", + "INPUTBANKACC[ROUTINGNUMBER]", + "input_bank_acc[routing_number]", + "Input bank acc[routing number]", + "Bank_acc[routing_number]_input", + "bankAcc[routingNumber]Input", + "bankacc[routingnumber]input", + "BANKACC[ROUTINGNUMBER]INPUT", + "bank_acc[routing_number]_input", + "Bank acc[routing number] input", + "Field_bank_acc_num", + "fieldBankAccNum", + "fieldbankaccnum", + "FIELDBANKACCNUM", + "field_bank_acc_num", + "Field bank acc num", + "Bank_acc_num_field", + "bankAccNumField", + "bankaccnumfield", + "BANKACCNUMFIELD", + "bank_acc_num_field", + "Bank acc num field", + "Input_bank_acc_num", + "inputBankAccNum", + "inputbankaccnum", + "INPUTBANKACCNUM", + "input_bank_acc_num", + "Input bank acc num", + "Bank_acc_num_input", + "bankAccNumInput", + "bankaccnuminput", + "BANKACCNUMINPUT", + "bank_acc_num_input", + "Bank acc num input", + "Field_bank_acc_number", + "fieldBankAccNumber", + "fieldbankaccnumber", + "FIELDBANKACCNUMBER", + "field_bank_acc_number", + "Field bank acc number", + "Bank_acc_number_field", + "bankAccNumberField", + "bankaccnumberfield", + "BANKACCNUMBERFIELD", + "bank_acc_number_field", + "Bank acc number field", + "Input_bank_acc_number", + "inputBankAccNumber", + "inputbankaccnumber", + "INPUTBANKACCNUMBER", + "input_bank_acc_number", + "Input bank acc number", + "Bank_acc_number_input", + "bankAccNumberInput", + "bankaccnumberinput", + "BANKACCNUMBERINPUT", + "bank_acc_number_input", + "Bank acc number input", + "Field_bank_account", + "fieldBankAccount", + "fieldbankaccount", + "FIELDBANKACCOUNT", + "field_bank_account", + "Field bank account", + "Bank_account_field", + "bankAccountField", + "bankaccountfield", + "BANKACCOUNTFIELD", + "bank_account_field", + "Bank account field", + "Input_bank_account", + "inputBankAccount", + "inputbankaccount", + "INPUTBANKACCOUNT", + "input_bank_account", + "Input bank account", + "Bank_account_input", + "bankAccountInput", + "bankaccountinput", + "BANKACCOUNTINPUT", + "bank_account_input", + "Bank account input", + "Field_bank_account[routing_number]", + "fieldBankAccount[routingNumber]", + "fieldbankaccount[routingnumber]", + "FIELDBANKACCOUNT[ROUTINGNUMBER]", + "field_bank_account[routing_number]", + "Field bank account[routing number]", + "Bank_account[routing_number]_field", + "bankAccount[routingNumber]Field", + "bankaccount[routingnumber]field", + "BANKACCOUNT[ROUTINGNUMBER]FIELD", + "bank_account[routing_number]_field", + "Bank account[routing number] field", + "Input_bank_account[routing_number]", + "inputBankAccount[routingNumber]", + "inputbankaccount[routingnumber]", + "INPUTBANKACCOUNT[ROUTINGNUMBER]", + "input_bank_account[routing_number]", + "Input bank account[routing number]", + "Bank_account[routing_number]_input", + "bankAccount[routingNumber]Input", + "bankaccount[routingnumber]input", + "BANKACCOUNT[ROUTINGNUMBER]INPUT", + "bank_account[routing_number]_input", + "Bank account[routing number] input", + "Field_bank_account_num", + "fieldBankAccountNum", + "fieldbankaccountnum", + "FIELDBANKACCOUNTNUM", + "field_bank_account_num", + "Field bank account num", + "Bank_account_num_field", + "bankAccountNumField", + "bankaccountnumfield", + "BANKACCOUNTNUMFIELD", + "bank_account_num_field", + "Bank account num field", + "Input_bank_account_num", + "inputBankAccountNum", + "inputbankaccountnum", + "INPUTBANKACCOUNTNUM", + "input_bank_account_num", + "Input bank account num", + "Bank_account_num_input", + "bankAccountNumInput", + "bankaccountnuminput", + "BANKACCOUNTNUMINPUT", + "bank_account_num_input", + "Bank account num input", + "Field_bank_account_number", + "fieldBankAccountNumber", + "fieldbankaccountnumber", + "FIELDBANKACCOUNTNUMBER", + "field_bank_account_number", + "Field bank account number", + "Bank_account_number_field", + "bankAccountNumberField", + "bankaccountnumberfield", + "BANKACCOUNTNUMBERFIELD", + "bank_account_number_field", + "Bank account number field", + "Input_bank_account_number", + "inputBankAccountNumber", + "inputbankaccountnumber", + "INPUTBANKACCOUNTNUMBER", + "input_bank_account_number", + "Input bank account number", + "Bank_account_number_input", + "bankAccountNumberInput", + "bankaccountnumberinput", + "BANKACCOUNTNUMBERINPUT", + "bank_account_number_input", + "Bank account number input", + "Field_card[cvv]", + "fieldCard[cvv]", + "fieldcard[cvv]", + "FIELDCARD[CVV]", + "field_card[cvv]", + "Field card[cvv]", + "Card[cvv]_field", + "card[cvv]Field", + "card[cvv]field", + "CARD[CVV]FIELD", + "card[cvv]_field", + "Card[cvv] field", + "Input_card[cvv]", + "inputCard[cvv]", + "inputcard[cvv]", + "INPUTCARD[CVV]", + "input_card[cvv]", + "Input card[cvv]", + "Card[cvv]_input", + "card[cvv]Input", + "card[cvv]input", + "CARD[CVV]INPUT", + "card[cvv]_input", + "Card[cvv] input", + "Field_card[num]", + "fieldCard[num]", + "fieldcard[num]", + "FIELDCARD[NUM]", + "field_card[num]", + "Field card[num]", + "Card[num]_field", + "card[num]Field", + "card[num]field", + "CARD[NUM]FIELD", + "card[num]_field", + "Card[num] field", + "Input_card[num]", + "inputCard[num]", + "inputcard[num]", + "INPUTCARD[NUM]", + "input_card[num]", + "Input card[num]", + "Card[num]_input", + "card[num]Input", + "card[num]input", + "CARD[NUM]INPUT", + "card[num]_input", + "Card[num] input", + "Field_card[number]", + "fieldCard[number]", + "fieldcard[number]", + "FIELDCARD[NUMBER]", + "field_card[number]", + "Field card[number]", + "Card[number]_field", + "card[number]Field", + "card[number]field", + "CARD[NUMBER]FIELD", + "card[number]_field", + "Card[number] field", + "Input_card[number]", + "inputCard[number]", + "inputcard[number]", + "INPUTCARD[NUMBER]", + "input_card[number]", + "Input card[number]", + "Card[number]_input", + "card[number]Input", + "card[number]input", + "CARD[NUMBER]INPUT", + "card[number]_input", + "Card[number] input", + "Field_card_cvv", + "fieldCardCvv", + "fieldcardcvv", + "FIELDCARDCVV", + "field_card_cvv", + "Field card cvv", + "Card_cvv_field", + "cardCvvField", + "cardcvvfield", + "CARDCVVFIELD", + "card_cvv_field", + "Card cvv field", + "Input_card_cvv", + "inputCardCvv", + "inputcardcvv", + "INPUTCARDCVV", + "input_card_cvv", + "Input card cvv", + "Card_cvv_input", + "cardCvvInput", + "cardcvvinput", + "CARDCVVINPUT", + "card_cvv_input", + "Card cvv input", + "Field_card_num", + "fieldCardNum", + "fieldcardnum", + "FIELDCARDNUM", + "field_card_num", + "Field card num", + "Card_num_field", + "cardNumField", + "cardnumfield", + "CARDNUMFIELD", + "card_num_field", + "Card num field", + "Input_card_num", + "inputCardNum", + "inputcardnum", + "INPUTCARDNUM", + "input_card_num", + "Input card num", + "Card_num_input", + "cardNumInput", + "cardnuminput", + "CARDNUMINPUT", + "card_num_input", + "Card num input", + "Field_card_number", + "fieldCardNumber", + "fieldcardnumber", + "FIELDCARDNUMBER", + "field_card_number", + "Field card number", + "Card_number_field", + "cardNumberField", + "cardnumberfield", + "CARDNUMBERFIELD", + "card_number_field", + "Card number field", + "Input_card_number", + "inputCardNumber", + "inputcardnumber", + "INPUTCARDNUMBER", + "input_card_number", + "Input card number", + "Card_number_input", + "cardNumberInput", + "cardnumberinput", + "CARDNUMBERINPUT", + "card_number_input", + "Card number input", + "Field_cc_num", + "fieldCcNum", + "fieldccnum", + "FIELDCCNUM", + "field_cc_num", + "Field cc num", + "Cc_num_field", + "ccNumField", + "ccnumfield", + "CCNUMFIELD", + "cc_num_field", + "Cc num field", + "Input_cc_num", + "inputCcNum", + "inputccnum", + "INPUTCCNUM", + "input_cc_num", + "Input cc num", + "Cc_num_input", + "ccNumInput", + "ccnuminput", + "CCNUMINPUT", + "cc_num_input", + "Cc num input", + "Field_cc_number", + "fieldCcNumber", + "fieldccnumber", + "FIELDCCNUMBER", + "field_cc_number", + "Field cc number", + "Cc_number_field", + "ccNumberField", + "ccnumberfield", + "CCNUMBERFIELD", + "cc_number_field", + "Cc number field", + "Input_cc_number", + "inputCcNumber", + "inputccnumber", + "INPUTCCNUMBER", + "input_cc_number", + "Input cc number", + "Cc_number_input", + "ccNumberInput", + "ccnumberinput", + "CCNUMBERINPUT", + "cc_number_input", + "Cc number input", + "Field_cert", + "fieldCert", + "fieldcert", + "FIELDCERT", + "field_cert", + "Field cert", + "Cert_field", + "certField", + "certfield", + "CERTFIELD", + "cert_field", + "Cert field", + "Input_cert", + "inputCert", + "inputcert", + "INPUTCERT", + "input_cert", + "Input cert", + "Cert_input", + "certInput", + "certinput", + "CERTINPUT", + "cert_input", + "Cert input", + "Field_certificate", + "fieldCertificate", + "fieldcertificate", + "FIELDCERTIFICATE", + "field_certificate", + "Field certificate", + "Certificate_field", + "certificateField", + "certificatefield", + "CERTIFICATEFIELD", + "certificate_field", + "Certificate field", + "Input_certificate", + "inputCertificate", + "inputcertificate", + "INPUTCERTIFICATE", + "input_certificate", + "Input certificate", + "Certificate_input", + "certificateInput", + "certificateinput", + "CERTIFICATEINPUT", + "certificate_input", + "Certificate input", + "Field_confirm_passwd", + "fieldConfirmPasswd", + "fieldconfirmpasswd", + "FIELDCONFIRMPASSWD", + "field_confirm_passwd", + "Field confirm passwd", + "Confirm_passwd_field", + "confirmPasswdField", + "confirmpasswdfield", + "CONFIRMPASSWDFIELD", + "confirm_passwd_field", + "Confirm passwd field", + "Input_confirm_passwd", + "inputConfirmPasswd", + "inputconfirmpasswd", + "INPUTCONFIRMPASSWD", + "input_confirm_passwd", + "Input confirm passwd", + "Confirm_passwd_input", + "confirmPasswdInput", + "confirmpasswdinput", + "CONFIRMPASSWDINPUT", + "confirm_passwd_input", + "Confirm passwd input", + "Field_confirm_password", + "fieldConfirmPassword", + "fieldconfirmpassword", + "FIELDCONFIRMPASSWORD", + "field_confirm_password", + "Field confirm password", + "Confirm_password_field", + "confirmPasswordField", + "confirmpasswordfield", + "CONFIRMPASSWORDFIELD", + "confirm_password_field", + "Confirm password field", + "Input_confirm_password", + "inputConfirmPassword", + "inputconfirmpassword", + "INPUTCONFIRMPASSWORD", + "input_confirm_password", + "Input confirm password", + "Confirm_password_input", + "confirmPasswordInput", + "confirmpasswordinput", + "CONFIRMPASSWORDINPUT", + "confirm_password_input", + "Confirm password input", + "Field_credentials", + "fieldCredentials", + "fieldcredentials", + "FIELDCREDENTIALS", + "field_credentials", + "Field credentials", + "Credentials_field", + "credentialsField", + "credentialsfield", + "CREDENTIALSFIELD", + "credentials_field", + "Credentials field", + "Input_credentials", + "inputCredentials", + "inputcredentials", + "INPUTCREDENTIALS", + "input_credentials", + "Input credentials", + "Credentials_input", + "credentialsInput", + "credentialsinput", + "CREDENTIALSINPUT", + "credentials_input", + "Credentials input", + "Field_credit_card", + "fieldCreditCard", + "fieldcreditcard", + "FIELDCREDITCARD", + "field_credit_card", + "Field credit card", + "Credit_card_field", + "creditCardField", + "creditcardfield", + "CREDITCARDFIELD", + "credit_card_field", + "Credit card field", + "Input_credit_card", + "inputCreditCard", + "inputcreditcard", + "INPUTCREDITCARD", + "input_credit_card", + "Input credit card", + "Credit_card_input", + "creditCardInput", + "creditcardinput", + "CREDITCARDINPUT", + "credit_card_input", + "Credit card input", + "Field_credit_card_num", + "fieldCreditCardNum", + "fieldcreditcardnum", + "FIELDCREDITCARDNUM", + "field_credit_card_num", + "Field credit card num", + "Credit_card_num_field", + "creditCardNumField", + "creditcardnumfield", + "CREDITCARDNUMFIELD", + "credit_card_num_field", + "Credit card num field", + "Input_credit_card_num", + "inputCreditCardNum", + "inputcreditcardnum", + "INPUTCREDITCARDNUM", + "input_credit_card_num", + "Input credit card num", + "Credit_card_num_input", + "creditCardNumInput", + "creditcardnuminput", + "CREDITCARDNUMINPUT", + "credit_card_num_input", + "Credit card num input", + "Field_credit_card_number", + "fieldCreditCardNumber", + "fieldcreditcardnumber", + "FIELDCREDITCARDNUMBER", + "field_credit_card_number", + "Field credit card number", + "Credit_card_number_field", + "creditCardNumberField", + "creditcardnumberfield", + "CREDITCARDNUMBERFIELD", + "credit_card_number_field", + "Credit card number field", + "Input_credit_card_number", + "inputCreditCardNumber", + "inputcreditcardnumber", + "INPUTCREDITCARDNUMBER", + "input_credit_card_number", + "Input credit card number", + "Credit_card_number_input", + "creditCardNumberInput", + "creditcardnumberinput", + "CREDITCARDNUMBERINPUT", + "credit_card_number_input", + "Credit card number input", + "Field_creds", + "fieldCreds", + "fieldcreds", + "FIELDCREDS", + "field_creds", + "Field creds", + "Creds_field", + "credsField", + "credsfield", + "CREDSFIELD", + "creds_field", + "Creds field", + "Input_creds", + "inputCreds", + "inputcreds", + "INPUTCREDS", + "input_creds", + "Input creds", + "Creds_input", + "credsInput", + "credsinput", + "CREDSINPUT", + "creds_input", + "Creds input", + "Field_csrf", + "field_csrf", + "Field csrf", + "Csrf_field", + "csrfField", + "csrf_field", + "Input_csrf", + "input_csrf", + "Input csrf", + "Csrf_input", + "csrfInput", + "csrf_input", + "Field_cvv", + "fieldCvv", + "fieldcvv", + "FIELDCVV", + "field_cvv", + "Field cvv", + "Cvv_field", + "cvvField", + "cvvfield", + "CVVFIELD", + "cvv_field", + "Cvv field", + "Input_cvv", + "inputCvv", + "inputcvv", + "INPUTCVV", + "input_cvv", + "Input cvv", + "Cvv_input", + "cvvInput", + "cvvinput", + "CVVINPUT", + "cvv_input", + "Cvv input", + "Field_issuer_certificate", + "fieldIssuerCertificate", + "fieldissuercertificate", + "FIELDISSUERCERTIFICATE", + "field_issuer_certificate", + "Field issuer certificate", + "Issuer_certificate_field", + "issuerCertificateField", + "issuercertificatefield", + "ISSUERCERTIFICATEFIELD", + "issuer_certificate_field", + "Issuer certificate field", + "Input_issuer_certificate", + "inputIssuerCertificate", + "inputissuercertificate", + "INPUTISSUERCERTIFICATE", + "input_issuer_certificate", + "Input issuer certificate", + "Issuer_certificate_input", + "issuerCertificateInput", + "issuercertificateinput", + "ISSUERCERTIFICATEINPUT", + "issuer_certificate_input", + "Issuer certificate input", + "Field_key", + "fieldKey", + "fieldkey", + "FIELDKEY", + "field_key", + "Field key", + "Key_field", + "keyField", + "keyfield", + "KEYFIELD", + "key_field", + "Key field", + "Input_key", + "inputKey", + "inputkey", + "INPUTKEY", + "input_key", + "Input key", + "Key_input", + "keyInput", + "keyinput", + "KEYINPUT", + "key_input", + "Key input", + "Field_mysql_pwd", + "fieldMysqlPwd", + "fieldmysqlpwd", + "FIELDMYSQLPWD", + "field_mysql_pwd", + "Field mysql pwd", + "Mysql_pwd_field", + "mysqlPwdField", + "mysqlpwdfield", + "MYSQLPWDFIELD", + "mysql_pwd_field", + "Mysql pwd field", + "Input_mysql_pwd", + "inputMysqlPwd", + "inputmysqlpwd", + "INPUTMYSQLPWD", + "input_mysql_pwd", + "Input mysql pwd", + "Mysql_pwd_input", + "mysqlPwdInput", + "mysqlpwdinput", + "MYSQLPWDINPUT", + "mysql_pwd_input", + "Mysql pwd input", + "Field_new_password", + "fieldNewPassword", + "fieldnewpassword", + "FIELDNEWPASSWORD", + "field_new_password", + "Field new password", + "New_password_field", + "newPasswordField", + "newpasswordfield", + "NEWPASSWORDFIELD", + "new_password_field", + "New password field", + "Input_new_password", + "inputNewPassword", + "inputnewpassword", + "INPUTNEWPASSWORD", + "input_new_password", + "Input new password", + "New_password_input", + "newPasswordInput", + "newpasswordinput", + "NEWPASSWORDINPUT", + "new_password_input", + "New password input", + "Field_old_password", + "fieldOldPassword", + "fieldoldpassword", + "FIELDOLDPASSWORD", + "field_old_password", + "Field old password", + "Old_password_field", + "oldPasswordField", + "oldpasswordfield", + "OLDPASSWORDFIELD", + "old_password_field", + "Old password field", + "Input_old_password", + "inputOldPassword", + "inputoldpassword", + "INPUTOLDPASSWORD", + "input_old_password", + "Input old password", + "Old_password_input", + "oldPasswordInput", + "oldpasswordinput", + "OLDPASSWORDINPUT", + "old_password_input", + "Old password input", + "Field_otp", + "fieldOtp", + "fieldotp", + "FIELDOTP", + "field_otp", + "Field otp", + "Otp_field", + "otpField", + "otpfield", + "OTPFIELD", + "otp_field", + "Otp field", + "Input_otp", + "inputOtp", + "inputotp", + "INPUTOTP", + "input_otp", + "Input otp", + "Otp_input", + "otpInput", + "otpinput", + "OTPINPUT", + "otp_input", + "Otp input", + "Field_otp_code", + "fieldOtpCode", + "fieldotpcode", + "FIELDOTPCODE", + "field_otp_code", + "Field otp code", + "Otp_code_field", + "otpCodeField", + "otpcodefield", + "OTPCODEFIELD", + "otp_code_field", + "Otp code field", + "Input_otp_code", + "inputOtpCode", + "inputotpcode", + "INPUTOTPCODE", + "input_otp_code", + "Input otp code", + "Otp_code_input", + "otpCodeInput", + "otpcodeinput", + "OTPCODEINPUT", + "otp_code_input", + "Otp code input", + "Field_otp_pin", + "fieldOtpPin", + "fieldotppin", + "FIELDOTPPIN", + "field_otp_pin", + "Field otp pin", + "Otp_pin_field", + "otpPinField", + "otppinfield", + "OTPPINFIELD", + "otp_pin_field", + "Otp pin field", + "Input_otp_pin", + "inputOtpPin", + "inputotppin", + "INPUTOTPPIN", + "input_otp_pin", + "Input otp pin", + "Otp_pin_input", + "otpPinInput", + "otppininput", + "OTPPININPUT", + "otp_pin_input", + "Otp pin input", + "Field_otp_token", + "fieldOtpToken", + "fieldotptoken", + "FIELDOTPTOKEN", + "field_otp_token", + "Field otp token", + "Otp_token_field", + "otpTokenField", + "otptokenfield", + "OTPTOKENFIELD", + "otp_token_field", + "Otp token field", + "Input_otp_token", + "inputOtpToken", + "inputotptoken", + "INPUTOTPTOKEN", + "input_otp_token", + "Input otp token", + "Otp_token_input", + "otpTokenInput", + "otptokeninput", + "OTPTOKENINPUT", + "otp_token_input", + "Otp token input", + "Field_passwd", + "fieldPasswd", + "fieldpasswd", + "FIELDPASSWD", + "field_passwd", + "Field passwd", + "Passwd_field", + "passwdField", + "passwdfield", + "PASSWDFIELD", + "passwd_field", + "Passwd field", + "Input_passwd", + "inputPasswd", + "inputpasswd", + "INPUTPASSWD", + "input_passwd", + "Input passwd", + "Passwd_input", + "passwdInput", + "passwdinput", + "PASSWDINPUT", + "passwd_input", + "Passwd input", + "Field_passwd_confirm", + "fieldPasswdConfirm", + "fieldpasswdconfirm", + "FIELDPASSWDCONFIRM", + "field_passwd_confirm", + "Field passwd confirm", + "Passwd_confirm_field", + "passwdConfirmField", + "passwdconfirmfield", + "PASSWDCONFIRMFIELD", + "passwd_confirm_field", + "Passwd confirm field", + "Input_passwd_confirm", + "inputPasswdConfirm", + "inputpasswdconfirm", + "INPUTPASSWDCONFIRM", + "input_passwd_confirm", + "Input passwd confirm", + "Passwd_confirm_input", + "passwdConfirmInput", + "passwdconfirminput", + "PASSWDCONFIRMINPUT", + "passwd_confirm_input", + "Passwd confirm input", + "Field_password", + "fieldPassword", + "fieldpassword", + "FIELDPASSWORD", + "field_password", + "Field password", + "Password_field", + "passwordField", + "passwordfield", + "PASSWORDFIELD", + "password_field", + "Password field", + "Input_password", + "inputPassword", + "inputpassword", + "INPUTPASSWORD", + "input_password", + "Input password", + "Password_input", + "passwordInput", + "passwordinput", + "PASSWORDINPUT", + "password_input", + "Password input", + "Field_password1", + "fieldPassword1", + "fieldpassword1", + "FIELDPASSWORD1", + "field_password1", + "Field password1", + "Password1_field", + "password1Field", + "password1field", + "PASSWORD1FIELD", + "password1_field", + "Password1 field", + "Input_password1", + "inputPassword1", + "inputpassword1", + "INPUTPASSWORD1", + "input_password1", + "Input password1", + "Password1_input", + "password1Input", + "password1input", + "PASSWORD1INPUT", + "password1_input", + "Password1 input", + "Field_password2", + "fieldPassword2", + "fieldpassword2", + "FIELDPASSWORD2", + "field_password2", + "Field password2", + "Password2_field", + "password2Field", + "password2field", + "PASSWORD2FIELD", + "password2_field", + "Password2 field", + "Input_password2", + "inputPassword2", + "inputpassword2", + "INPUTPASSWORD2", + "input_password2", + "Input password2", + "Password2_input", + "password2Input", + "password2input", + "PASSWORD2INPUT", + "password2_input", + "Password2 input", + "Field_password_confirm", + "fieldPasswordConfirm", + "fieldpasswordconfirm", + "FIELDPASSWORDCONFIRM", + "field_password_confirm", + "Field password confirm", + "Password_confirm_field", + "passwordConfirmField", + "passwordconfirmfield", + "PASSWORDCONFIRMFIELD", + "password_confirm_field", + "Password confirm field", + "Input_password_confirm", + "inputPasswordConfirm", + "inputpasswordconfirm", + "INPUTPASSWORDCONFIRM", + "input_password_confirm", + "Input password confirm", + "Password_confirm_input", + "passwordConfirmInput", + "passwordconfirminput", + "PASSWORDCONFIRMINPUT", + "password_confirm_input", + "Password confirm input", + "Field_pin", + "fieldPin", + "fieldpin", + "FIELDPIN", + "field_pin", + "Field pin", + "Pin_field", + "pinField", + "pinfield", + "PINFIELD", + "pin_field", + "Pin field", + "Input_pin", + "inputPin", + "inputpin", + "INPUTPIN", + "input_pin", + "Input pin", + "Pin_input", + "pinInput", + "pininput", + "PININPUT", + "pin_input", + "Pin input", + "Field_private_key", + "fieldPrivateKey", + "fieldprivatekey", + "FIELDPRIVATEKEY", + "field_private_key", + "Field private key", + "Private_key_field", + "privateKeyField", + "privatekeyfield", + "PRIVATEKEYFIELD", + "private_key_field", + "Private key field", + "Input_private_key", + "inputPrivateKey", + "inputprivatekey", + "INPUTPRIVATEKEY", + "input_private_key", + "Input private key", + "Private_key_input", + "privateKeyInput", + "privatekeyinput", + "PRIVATEKEYINPUT", + "private_key_input", + "Private key input", + "Field_pwd", + "fieldPwd", + "fieldpwd", + "FIELDPWD", + "field_pwd", + "Field pwd", + "Pwd_field", + "pwdField", + "pwdfield", + "PWDFIELD", + "pwd_field", + "Pwd field", + "Input_pwd", + "inputPwd", + "inputpwd", + "INPUTPWD", + "input_pwd", + "Input pwd", + "Pwd_input", + "pwdInput", + "pwdinput", + "PWDINPUT", + "pwd_input", + "Pwd input", + "Field_raw", + "fieldRaw", + "fieldraw", + "FIELDRAW", + "field_raw", + "Field raw", + "Raw_field", + "rawField", + "rawfield", + "RAWFIELD", + "raw_field", + "Raw field", + "Input_raw", + "inputRaw", + "inputraw", + "INPUTRAW", + "input_raw", + "Input raw", + "Raw_input", + "rawInput", + "rawinput", + "RAWINPUT", + "raw_input", + "Raw input", + "Field_repeat_password", + "fieldRepeatPassword", + "fieldrepeatpassword", + "FIELDREPEATPASSWORD", + "field_repeat_password", + "Field repeat password", + "Repeat_password_field", + "repeatPasswordField", + "repeatpasswordfield", + "REPEATPASSWORDFIELD", + "repeat_password_field", + "Repeat password field", + "Input_repeat_password", + "inputRepeatPassword", + "inputrepeatpassword", + "INPUTREPEATPASSWORD", + "input_repeat_password", + "Input repeat password", + "Repeat_password_input", + "repeatPasswordInput", + "repeatpasswordinput", + "REPEATPASSWORDINPUT", + "repeat_password_input", + "Repeat password input", + "Field_routing_acc", + "fieldRoutingAcc", + "fieldroutingacc", + "FIELDROUTINGACC", + "field_routing_acc", + "Field routing acc", + "Routing_acc_field", + "routingAccField", + "routingaccfield", + "ROUTINGACCFIELD", + "routing_acc_field", + "Routing acc field", + "Input_routing_acc", + "inputRoutingAcc", + "inputroutingacc", + "INPUTROUTINGACC", + "input_routing_acc", + "Input routing acc", + "Routing_acc_input", + "routingAccInput", + "routingaccinput", + "ROUTINGACCINPUT", + "routing_acc_input", + "Routing acc input", + "Field_routing_acc_num", + "fieldRoutingAccNum", + "fieldroutingaccnum", + "FIELDROUTINGACCNUM", + "field_routing_acc_num", + "Field routing acc num", + "Routing_acc_num_field", + "routingAccNumField", + "routingaccnumfield", + "ROUTINGACCNUMFIELD", + "routing_acc_num_field", + "Routing acc num field", + "Input_routing_acc_num", + "inputRoutingAccNum", + "inputroutingaccnum", + "INPUTROUTINGACCNUM", + "input_routing_acc_num", + "Input routing acc num", + "Routing_acc_num_input", + "routingAccNumInput", + "routingaccnuminput", + "ROUTINGACCNUMINPUT", + "routing_acc_num_input", + "Routing acc num input", + "Field_routing_acc_number", + "fieldRoutingAccNumber", + "fieldroutingaccnumber", + "FIELDROUTINGACCNUMBER", + "field_routing_acc_number", + "Field routing acc number", + "Routing_acc_number_field", + "routingAccNumberField", + "routingaccnumberfield", + "ROUTINGACCNUMBERFIELD", + "routing_acc_number_field", + "Routing acc number field", + "Input_routing_acc_number", + "inputRoutingAccNumber", + "inputroutingaccnumber", + "INPUTROUTINGACCNUMBER", + "input_routing_acc_number", + "Input routing acc number", + "Routing_acc_number_input", + "routingAccNumberInput", + "routingaccnumberinput", + "ROUTINGACCNUMBERINPUT", + "routing_acc_number_input", + "Routing acc number input", + "Field_routing_account_number", + "fieldRoutingAccountNumber", + "fieldroutingaccountnumber", + "FIELDROUTINGACCOUNTNUMBER", + "field_routing_account_number", + "Field routing account number", + "Routing_account_number_field", + "routingAccountNumberField", + "routingaccountnumberfield", + "ROUTINGACCOUNTNUMBERFIELD", + "routing_account_number_field", + "Routing account number field", + "Input_routing_account_number", + "inputRoutingAccountNumber", + "inputroutingaccountnumber", + "INPUTROUTINGACCOUNTNUMBER", + "input_routing_account_number", + "Input routing account number", + "Routing_account_number_input", + "routingAccountNumberInput", + "routingaccountnumberinput", + "ROUTINGACCOUNTNUMBERINPUT", + "routing_account_number_input", + "Routing account number input", + "Field_routing_number", + "fieldRoutingNumber", + "fieldroutingnumber", + "FIELDROUTINGNUMBER", + "field_routing_number", + "Field routing number", + "Routing_number_field", + "routingNumberField", + "routingnumberfield", + "ROUTINGNUMBERFIELD", + "routing_number_field", + "Routing number field", + "Input_routing_number", + "inputRoutingNumber", + "inputroutingnumber", + "INPUTROUTINGNUMBER", + "input_routing_number", + "Input routing number", + "Routing_number_input", + "routingNumberInput", + "routingnumberinput", + "ROUTINGNUMBERINPUT", + "routing_number_input", + "Routing number input", + "Field_salt", + "fieldSalt", + "fieldsalt", + "FIELDSALT", + "field_salt", + "Field salt", + "Salt_field", + "saltField", + "saltfield", + "SALTFIELD", + "salt_field", + "Salt field", + "Input_salt", + "inputSalt", + "inputsalt", + "INPUTSALT", + "input_salt", + "Input salt", + "Salt_input", + "saltInput", + "saltinput", + "SALTINPUT", + "salt_input", + "Salt input", + "Field_secret", + "fieldSecret", + "fieldsecret", + "FIELDSECRET", + "field_secret", + "Field secret", + "Secret_field", + "secretField", + "secretfield", + "SECRETFIELD", + "secret_field", + "Secret field", + "Input_secret", + "inputSecret", + "inputsecret", + "INPUTSECRET", + "input_secret", + "Input secret", + "Secret_input", + "secretInput", + "secretinput", + "SECRETINPUT", + "secret_input", + "Secret input", + "Field_security_code", + "fieldSecurityCode", + "fieldsecuritycode", + "FIELDSECURITYCODE", + "field_security_code", + "Field security code", + "Security_code_field", + "securityCodeField", + "securitycodefield", + "SECURITYCODEFIELD", + "security_code_field", + "Security code field", + "Input_security_code", + "inputSecurityCode", + "inputsecuritycode", + "INPUTSECURITYCODE", + "input_security_code", + "Input security code", + "Security_code_input", + "securityCodeInput", + "securitycodeinput", + "SECURITYCODEINPUT", + "security_code_input", + "Security code input", + "Field_security_pin", + "fieldSecurityPin", + "fieldsecuritypin", + "FIELDSECURITYPIN", + "field_security_pin", + "Field security pin", + "Security_pin_field", + "securityPinField", + "securitypinfield", + "SECURITYPINFIELD", + "security_pin_field", + "Security pin field", + "Input_security_pin", + "inputSecurityPin", + "inputsecuritypin", + "INPUTSECURITYPIN", + "input_security_pin", + "Input security pin", + "Security_pin_input", + "securityPinInput", + "securitypininput", + "SECURITYPININPUT", + "security_pin_input", + "Security pin input", + "Field_security_token", + "fieldSecurityToken", + "fieldsecuritytoken", + "FIELDSECURITYTOKEN", + "field_security_token", + "Field security token", + "Security_token_field", + "securityTokenField", + "securitytokenfield", + "SECURITYTOKENFIELD", + "security_token_field", + "Security token field", + "Input_security_token", + "inputSecurityToken", + "inputsecuritytoken", + "INPUTSECURITYTOKEN", + "input_security_token", + "Input security token", + "Security_token_input", + "securityTokenInput", + "securitytokeninput", + "SECURITYTOKENINPUT", + "security_token_input", + "Security token input", + "Field_social_security_num", + "fieldSocialSecurityNum", + "fieldsocialsecuritynum", + "FIELDSOCIALSECURITYNUM", + "field_social_security_num", + "Field social security num", + "Social_security_num_field", + "socialSecurityNumField", + "socialsecuritynumfield", + "SOCIALSECURITYNUMFIELD", + "social_security_num_field", + "Social security num field", + "Input_social_security_num", + "inputSocialSecurityNum", + "inputsocialsecuritynum", + "INPUTSOCIALSECURITYNUM", + "input_social_security_num", + "Input social security num", + "Social_security_num_input", + "socialSecurityNumInput", + "socialsecuritynuminput", + "SOCIALSECURITYNUMINPUT", + "social_security_num_input", + "Social security num input", + "Field_social_security_number", + "fieldSocialSecurityNumber", + "fieldsocialsecuritynumber", + "FIELDSOCIALSECURITYNUMBER", + "field_social_security_number", + "Field social security number", + "Social_security_number_field", + "socialSecurityNumberField", + "socialsecuritynumberfield", + "SOCIALSECURITYNUMBERFIELD", + "social_security_number_field", + "Social security number field", + "Input_social_security_number", + "inputSocialSecurityNumber", + "inputsocialsecuritynumber", + "INPUTSOCIALSECURITYNUMBER", + "input_social_security_number", + "Input social security number", + "Social_security_number_input", + "socialSecurityNumberInput", + "socialsecuritynumberinput", + "SOCIALSECURITYNUMBERINPUT", + "social_security_number_input", + "Social security number input", + "Field_ssn", + "fieldSsn", + "fieldssn", + "FIELDSSN", + "field_ssn", + "Field ssn", + "Ssn_field", + "ssnField", + "ssnfield", + "SSNFIELD", + "ssn_field", + "Ssn field", + "Input_ssn", + "inputSsn", + "inputssn", + "INPUTSSN", + "input_ssn", + "Input ssn", + "Ssn_input", + "ssnInput", + "ssninput", + "SSNINPUT", + "ssn_input", + "Ssn input", + "Field_stripe_token", + "fieldStripeToken", + "fieldstripetoken", + "FIELDSTRIPETOKEN", + "field_stripe_token", + "Field stripe token", + "Stripe_token_field", + "stripeTokenField", + "stripetokenfield", + "STRIPETOKENFIELD", + "stripe_token_field", + "Stripe token field", + "Input_stripe_token", + "inputStripeToken", + "inputstripetoken", + "INPUTSTRIPETOKEN", + "input_stripe_token", + "Input stripe token", + "Stripe_token_input", + "stripeTokenInput", + "stripetokeninput", + "STRIPETOKENINPUT", + "stripe_token_input", + "Stripe token input", + "Field_token", + "fieldToken", + "fieldtoken", + "FIELDTOKEN", + "field_token", + "Field token", + "Token_field", + "tokenField", + "tokenfield", + "TOKENFIELD", + "token_field", + "Token field", + "Input_token", + "inputToken", + "inputtoken", + "INPUTTOKEN", + "input_token", + "Input token", + "Token_input", + "tokenInput", + "tokeninput", + "TOKENINPUT", + "token_input", + "Token input", + "Field_totp", + "fieldTotp", + "fieldtotp", + "FIELDTOTP", + "field_totp", + "Field totp", + "Totp_field", + "totpField", + "totpfield", + "TOTPFIELD", + "totp_field", + "Totp field", + "Input_totp", + "inputTotp", + "inputtotp", + "INPUTTOTP", + "input_totp", + "Input totp", + "Totp_input", + "totpInput", + "totpinput", + "TOTPINPUT", + "totp_input", + "Totp input", + "Field_totp_code", + "fieldTotpCode", + "fieldtotpcode", + "FIELDTOTPCODE", + "field_totp_code", + "Field totp code", + "Totp_code_field", + "totpCodeField", + "totpcodefield", + "TOTPCODEFIELD", + "totp_code_field", + "Totp code field", + "Input_totp_code", + "inputTotpCode", + "inputtotpcode", + "INPUTTOTPCODE", + "input_totp_code", + "Input totp code", + "Totp_code_input", + "totpCodeInput", + "totpcodeinput", + "TOTPCODEINPUT", + "totp_code_input", + "Totp code input", + "Field_totp_pin", + "fieldTotpPin", + "fieldtotppin", + "FIELDTOTPPIN", + "field_totp_pin", + "Field totp pin", + "Totp_pin_field", + "totpPinField", + "totppinfield", + "TOTPPINFIELD", + "totp_pin_field", + "Totp pin field", + "Input_totp_pin", + "inputTotpPin", + "inputtotppin", + "INPUTTOTPPIN", + "input_totp_pin", + "Input totp pin", + "Totp_pin_input", + "totpPinInput", + "totppininput", + "TOTPPININPUT", + "totp_pin_input", + "Totp pin input", + "Field_totp_token", + "fieldTotpToken", + "fieldtotptoken", + "FIELDTOTPTOKEN", + "field_totp_token", + "Field totp token", + "Totp_token_field", + "totpTokenField", + "totptokenfield", + "TOTPTOKENFIELD", + "totp_token_field", + "Totp token field", + "Input_totp_token", + "inputTotpToken", + "inputtotptoken", + "INPUTTOTPTOKEN", + "input_totp_token", + "Input totp token", + "Totp_token_input", + "totpTokenInput", + "totptokeninput", + "TOTPTOKENINPUT", + "totp_token_input", + "Totp token input", + "Field_two_factor_code", + "fieldTwoFactorCode", + "fieldtwofactorcode", + "FIELDTWOFACTORCODE", + "field_two_factor_code", + "Field two factor code", + "Two_factor_code_field", + "twoFactorCodeField", + "twofactorcodefield", + "TWOFACTORCODEFIELD", + "two_factor_code_field", + "Two factor code field", + "Input_two_factor_code", + "inputTwoFactorCode", + "inputtwofactorcode", + "INPUTTWOFACTORCODE", + "input_two_factor_code", + "Input two factor code", + "Two_factor_code_input", + "twoFactorCodeInput", + "twofactorcodeinput", + "TWOFACTORCODEINPUT", + "two_factor_code_input", + "Two factor code input", + "Field_two_factor_pin", + "fieldTwoFactorPin", + "fieldtwofactorpin", + "FIELDTWOFACTORPIN", + "field_two_factor_pin", + "Field two factor pin", + "Two_factor_pin_field", + "twoFactorPinField", + "twofactorpinfield", + "TWOFACTORPINFIELD", + "two_factor_pin_field", + "Two factor pin field", + "Input_two_factor_pin", + "inputTwoFactorPin", + "inputtwofactorpin", + "INPUTTWOFACTORPIN", + "input_two_factor_pin", + "Input two factor pin", + "Two_factor_pin_input", + "twoFactorPinInput", + "twofactorpininput", + "TWOFACTORPININPUT", + "two_factor_pin_input", + "Two factor pin input", + "Field_two_factor_token", + "fieldTwoFactorToken", + "fieldtwofactortoken", + "FIELDTWOFACTORTOKEN", + "field_two_factor_token", + "Field two factor token", + "Two_factor_token_field", + "twoFactorTokenField", + "twofactortokenfield", + "TWOFACTORTOKENFIELD", + "two_factor_token_field", + "Two factor token field", + "Input_two_factor_token", + "inputTwoFactorToken", + "inputtwofactortoken", + "INPUTTWOFACTORTOKEN", + "input_two_factor_token", + "Input two factor token", + "Two_factor_token_input", + "twoFactorTokenInput", + "twofactortokeninput", + "TWOFACTORTOKENINPUT", + "two_factor_token_input", + "Two factor token input" +] \ No newline at end of file diff --git a/src/test/java/dev/blaauwendraad/masker/json/util/JsonPathTestUtils.java b/src/test/java/dev/blaauwendraad/masker/json/util/JsonPathTestUtils.java deleted file mode 100644 index 8933ae47..00000000 --- a/src/test/java/dev/blaauwendraad/masker/json/util/JsonPathTestUtils.java +++ /dev/null @@ -1,102 +0,0 @@ -package dev.blaauwendraad.masker.json.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import dev.blaauwendraad.masker.json.path.JsonPathParser; -import dev.blaauwendraad.masker.randomgen.RandomJsonGenerator; - -import java.util.AbstractMap; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Deque; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; - -public class JsonPathTestUtils { - - /** - * Transforms an input set of keys into a set of JSONPath keys for a given json. - * The input set of keys are assumed not to be jsonpath keys already. - * If a key from the input set does not exist in the json, - * then a path from the down-left most key in the json is used as a prefix to the key. - *

- * Given that the input will expand to much larger set of JSONPaths, which would lead to skewed benchmarks, - * only the subset of JSONPaths is returned, that is equal to amount of incoming keys. - * - * @param keys a set of keys to be transformed into jason path keys. Assumed not to be jsonpath keys already. - * @param json a target json. - * @return a set of JSONPath keys transformed from keys. - */ - public static Set transformToJsonPathKeys(Set keys, String json) { - JsonNode root; - try { - root = new ObjectMapper().readTree(json.toLowerCase()); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Illegal input json.", e); - } - JsonPathParser jsonPathParser = new JsonPathParser(); - Set transformedTargetKeys = new HashSet<>(); - for (String targetKey : keys) { - targetKey = targetKey.toLowerCase(); - Deque> stack = new ArrayDeque<>(); - stack.push(new AbstractMap.SimpleEntry<>("$", root)); - while (!stack.isEmpty()) { - Map.Entry curr = stack.pop(); - String candidateKey = curr.getKey() + "." + targetKey; - if (jsonPathParser.tryParse(candidateKey) == null) { - continue; - } - if (curr.getValue() instanceof ObjectNode currObject) { - Iterator> fieldsIterator = currObject.fields(); - while (fieldsIterator.hasNext()) { - Map.Entry child = fieldsIterator.next(); - if (child.getKey().equals(targetKey)) { - transformedTargetKeys.add(candidateKey); - } - stack.push(new AbstractMap.SimpleEntry<>(curr.getKey() + "." + child.getKey(), child.getValue())); - } - } else if (curr.getValue() instanceof ArrayNode currArray) { - for (int i = 0; i < currArray.size(); i++) { - stack.push(new AbstractMap.SimpleEntry<>(curr.getKey() + "[*]", currArray.get(i))); - } - } - if (stack.isEmpty()) { - // the key does not exist - transformedTargetKeys.add(candidateKey); - } - } - } - List allKeys = disambiguate(new ArrayList<>(transformedTargetKeys)); - Collections.shuffle(allKeys, new Random(RandomJsonGenerator.STATIC_RANDOM_SEED)); - return new HashSet<>(allKeys.subList(0, Math.min(keys.size(), allKeys.size()))); - } - - /** - * Disambiguates the input list of jsonpath keys. - *

- * If two keys $.a.b and $.a are present, the more specific $.a.b will be chosen. - * - * @param jsonPathKeys the input list of jsonpath keys - * @return disambiguated set of jsonpath keys - */ - public static List disambiguate(List jsonPathKeys) { - Set disambiguated = new HashSet<>(jsonPathKeys); - Collections.sort(jsonPathKeys); - for (int i = 1; i < jsonPathKeys.size(); i++) { - String current = jsonPathKeys.get(i-1); - String next = jsonPathKeys.get(i); - if (next.indexOf(current) == 0 && !next.equals(current) && next.charAt(current.length()) == '.') { - disambiguated.remove(current); - } - } - return new ArrayList<>(disambiguated); - } -}