estimatedGuesses property
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();
}