AAPT2: Use hash map for StringPool indices

Hash map has better locality and average case performance

Change-Id: Ic2d111c3cff1d5c0e7e9cbe36714669e6508c275
diff --git a/tools/aapt2/util/StringPiece.h b/tools/aapt2/util/StringPiece.h
index f91bccc..f5c985b 100644
--- a/tools/aapt2/util/StringPiece.h
+++ b/tools/aapt2/util/StringPiece.h
@@ -19,6 +19,7 @@
 
 #include <ostream>
 #include <string>
+#include <utils/JenkinsHash.h>
 #include <utils/String8.h>
 #include <utils/Unicode.h>
 
@@ -257,4 +258,17 @@
     return out.write(utf8.string(), utf8.size());
 }
 
+namespace std {
+
+template <typename TChar>
+struct hash<aapt::BasicStringPiece<TChar>> {
+    size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
+        uint32_t hashCode = android::JenkinsHashMixBytes(
+                0, reinterpret_cast<const uint8_t*>(str.data()), sizeof(TChar) * str.size());
+        return static_cast<size_t>(hashCode);
+    }
+};
+
+} // namespace std
+
 #endif // AAPT_STRING_PIECE_H