Calculate metrics regarding password reuse in a more efficient manner.
commit373e8026a683570f40035d6e459131b7a96b25e2
authorengedy <engedy@chromium.org>
Fri, 11 Sep 2015 09:40:00 +0000 (11 02:40 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 11 Sep 2015 09:40:31 +0000 (11 09:40 +0000)
treebd550007a46142ca54534c0066eab0f44f0caed5
parentac351a80918fdfabb89cea14eddc89e3f50fde56
Calculate metrics regarding password reuse in a more efficient manner.

Calculating these metrics involves counting, for each stored account, the number of other accounts that are reusing the same password.  The numbers are further split based on whether each of the accounts are for HTTP or HTTPS sites, and whether the "other" account is for the same domain, a public suffix matching domain, or a different domain.

Because the old implementation relied on IsPublicSuffixDomainMatch() to tell if two domains were PSL matches (i.e. relied on using a binary comparison operator for finding equivalence classes), it necessarily involved nested for-loops, and had a complexity of O(n^2), where n is the number of accounts, with a high constant factor.  This proved to take several tenths of seconds for users with lots of passwords.

This CL improves on performance in two ways:
 -- It pre-calculates and caches the registry controlled portions of domains for each account, using only O(n) calls to GetRegistryControlledDomain(), which is the term that has the highest constant factor.
 -- Instead of enumerating over all "other" accounts for each account, the new solution first groups accounts by domain and by registry controlled domain, then calculates the total number of accounts in each of these groups plus the grand totals, and finally uses the inclusion-exclusion principle to derive the desired numbers. This has a total complexity of only O(n*log(n)).

BUG=517422

Review URL: https://codereview.chromium.org/1330333002

Cr-Commit-Position: refs/heads/master@{#348369}
components/password_manager/core/browser/login_database.cc
components/password_manager/core/browser/login_database_unittest.cc