71 lines
2.3 KiB
Java
71 lines
2.3 KiB
Java
package unit;
|
|
|
|
import java.util.*;
|
|
|
|
/**
|
|
* substrate-0002: CWE-407 Aura/BABE/BEEFY is_member linear authority scan
|
|
*
|
|
* Simulates:
|
|
* Slow: authorities.iter().any(|id| id == authority_id) — O(A)
|
|
* Fast: authorities.binary_search(authority_id).is_ok() — O(log A)
|
|
*/
|
|
public class IsMemberAlgorithm {
|
|
|
|
static class Result {
|
|
final long ops;
|
|
final boolean found;
|
|
Result(long ops, boolean found) { this.ops = ops; this.found = found; }
|
|
}
|
|
|
|
/** Slow: linear scan. Mirrors .iter().any() */
|
|
static Result slowIsMember(int[] authorities, int target) {
|
|
long ops = 0;
|
|
for (int id : authorities) {
|
|
ops++;
|
|
if (id == target) return new Result(ops, true);
|
|
}
|
|
return new Result(ops, false);
|
|
}
|
|
|
|
/** Fast: binary search. Mirrors .binary_search() on sorted BoundedVec */
|
|
static Result fastIsMember(int[] sortedAuthorities, int target) {
|
|
int lo = 0, hi = sortedAuthorities.length - 1;
|
|
long ops = 0;
|
|
while (lo <= hi) {
|
|
ops++;
|
|
int mid = (lo + hi) >>> 1;
|
|
if (sortedAuthorities[mid] == target) return new Result(ops, true);
|
|
else if (sortedAuthorities[mid] < target) lo = mid + 1;
|
|
else hi = mid - 1;
|
|
}
|
|
return new Result(ops, false);
|
|
}
|
|
|
|
static void bench() {
|
|
int N_AUTH = 1000;
|
|
int[] authorities = new int[N_AUTH];
|
|
for (int i = 0; i < N_AUTH; i++) authorities[i] = i * 2; // even IDs, sorted
|
|
|
|
// Worst case: target not present (or last element)
|
|
int target = N_AUTH * 2 - 1; // odd, not in list → full scan
|
|
|
|
Result slow = slowIsMember(authorities, target);
|
|
Result fast = fastIsMember(authorities, target);
|
|
|
|
System.out.println("is_member N_AUTH=" + N_AUTH);
|
|
System.out.println(" slow ops: " + slow.ops + " found=" + slow.found);
|
|
System.out.println(" fast ops: " + fast.ops + " found=" + fast.found);
|
|
|
|
double speedup = (double) slow.ops / fast.ops;
|
|
System.out.printf(" speedup: %.1fx%n", speedup);
|
|
|
|
assert slow.found == fast.found : "result mismatch";
|
|
assert slow.ops > fast.ops * 10 : "expected >10x speedup, got " + speedup;
|
|
|
|
System.out.println("1/1 PASS");
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
bench();
|
|
}
|
|
}
|