@@ -1,31 +1,32 @@
#include <zxcvbn/frequency_lists.hpp>
-#include <unordered_map>
#include <utility>
+#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
namespace zxcvbn {
namespace {
-std::unordered_map<DictionaryTag, RankedDict>& ranked_dicts() {
- static base::NoDestructor<std::unordered_map<DictionaryTag, RankedDict>>
+base::flat_map<DictionaryTag, RankedDict>& ranked_dicts() {
+ static base::NoDestructor<base::flat_map<DictionaryTag, RankedDict>>
ranked_dicts;
return *ranked_dicts;
}
} // namespace
-void SetRankedDicts(std::unordered_map<DictionaryTag, RankedDict> dicts) {
+void SetRankedDicts(base::flat_map<DictionaryTag, RankedDict> dicts) {
ranked_dicts() = std::move(dicts);
}
-RankedDicts convert_to_ranked_dicts(std::unordered_map<DictionaryTag, RankedDict> & ranked_dicts) {
+RankedDicts convert_to_ranked_dicts(
+ base::flat_map<DictionaryTag, RankedDict>& ranked_dicts) {
RankedDicts build;
for (const auto & item : ranked_dicts) {
- build.insert(item);
+ build.emplace(item.first, &item.second);
}
return build;
@@ -3,11 +3,10 @@
#include <zxcvbn/frequency_lists_common.hpp>
-#include <unordered_map>
-
#include <cstdint>
#include "base/strings/string_piece.h"
+#include "base/containers/flat_map.h"
namespace zxcvbn {
@@ -23,24 +22,13 @@ enum class DictionaryTag {
}
-namespace std {
-
-template<>
-struct hash<zxcvbn::DictionaryTag> {
- std::size_t operator()(const zxcvbn::DictionaryTag & v) const {
- return static_cast<std::size_t>(v);
- }
-};
-
-}
-
namespace zxcvbn {
-using RankedDicts = std::unordered_map<DictionaryTag, const RankedDict &>;
+using RankedDicts = base::flat_map<DictionaryTag, const RankedDict*>;
-void SetRankedDicts(std::unordered_map<DictionaryTag, RankedDict> dicts);
+void SetRankedDicts(base::flat_map<DictionaryTag, RankedDict> dicts);
-RankedDicts convert_to_ranked_dicts(std::unordered_map<DictionaryTag, RankedDict> & ranked_dicts);
+RankedDicts convert_to_ranked_dicts(base::flat_map<DictionaryTag, RankedDict> & ranked_dicts);
RankedDicts default_ranked_dicts();
}
@@ -1,26 +1,27 @@
#ifndef __ZXCVBN__FREQUENCY_LISTS_COMMON_HPP
#define __ZXCVBN__FREQUENCY_LISTS_COMMON_HPP
+#include <cstdint>
#include <string>
-#include <unordered_map>
-#include <utility>
+#include <vector>
-#include <cstdint>
+#include "base/containers/flat_map.h"
namespace zxcvbn {
using rank_t = std::size_t;
-using RankedDict = std::unordered_map<std::string, rank_t>;
+using RankedDict = base::flat_map<std::string, rank_t>;
template<class T>
RankedDict build_ranked_dict(const T & ordered_list) {
- RankedDict result;
+ std::vector<RankedDict::value_type> items;
+ items.reserve(ordered_list.size());
rank_t idx = 1; // rank starts at 1, not 0
for (const auto & word : ordered_list) {
- result.insert(std::make_pair(word, idx));
+ items.emplace_back(word, idx);
idx += 1;
}
- return result;
+ return RankedDict(std::move(items));
}
}
@@ -124,8 +124,8 @@ std::vector<Match> omnimatch(const std::string & password,
auto ranked_dictionaries = default_ranked_dicts();
auto ranked_dict = build_ranked_dict(ordered_list);
- ranked_dictionaries.insert(std::make_pair(DictionaryTag::USER_INPUTS,
- std::cref(ranked_dict)));
+ ranked_dictionaries.insert(
+ std::make_pair(DictionaryTag::USER_INPUTS, &ranked_dict));
std::vector<Match> matches;
std::function<std::vector<Match>(const std::string&)> matchers[] = {
@@ -159,7 +159,7 @@ std::vector<Match> dictionary_match(const std::string & password,
auto password_lower = dict_normalize(password);
for (const auto & item : ranked_dictionaries) {
auto dictionary_tag = item.first;
- auto & ranked_dict = item.second;
+ auto& ranked_dict = *item.second;
for (decltype(len) i = 0, idx = 0; idx < len; util::utf8_decode(password, idx), ++i) {
for (decltype(len) j = i, jdx = idx; jdx < len; ++j) {
// j is inclusive, but jdx is not so eagerly iterate jdx