estimatedGuesses property

  1. @override
double get estimatedGuesses
override

Should return the estimated number of guesses for the token.

Implementation

@override
double get estimatedGuesses {
  double guesses = 0;
  double averageDegree = 0;
  for (final List<String?> neighbors in graph.values) {
    averageDegree += neighbors.where((String? entry) => entry != null).length;
  }
  averageDegree /= graph.keys.length;
  // Estimate the number of possible patterns with token length or less with
  // turns or less.
  for (int i = 1; i < length; i++) {
    final int possibleTurns = min(turns, i);
    for (int j = 0; j < possibleTurns; j++) {
      guesses += nCk(i, j) * graph.keys.length * pow(averageDegree, j + 1);
    }
  }
  // Add extra guesses for shifted keys (% instead of 5, A instead of a).
  // Math is similar to extra guesses of l33t substitutions in dictionary
  // matches.
  if (shiftedCount > 0) {
    final int unShiftedCount = length - shiftedCount;
    if (unShiftedCount == 0) {
      guesses *= 2;
    } else {
      double shiftedVariations = 0;
      for (int i = 1; i <= min(shiftedCount, unShiftedCount); i++) {
        shiftedVariations += nCk(shiftedCount + unShiftedCount, i);
      }
      guesses *= shiftedVariations;
    }
  }
  return guesses.roundToDouble();
}