From c3ccff19603c0778781fd18e0e38e55950420780 Mon Sep 17 00:00:00 2001 From: Alan Ding Date: Mon, 29 Apr 2024 00:44:31 -0700 Subject: ui: Refactor DisplayIdentification to use ftl::stable_hash Replace cityHash64Len0To16 with ftl::stable_hash which can handle up to 64 bytes string instead of just up to 16. Bug: 185536303 Bug: 194863377 Test: DisplayIdentification_test Change-Id: I90056145033ed5798dd5f5d99884028749d5d879 --- libs/ui/DisplayIdentification.cpp | 67 ++------------------------------------- 1 file changed, 2 insertions(+), 65 deletions(-) (limited to 'libs/ui/DisplayIdentification.cpp') diff --git a/libs/ui/DisplayIdentification.cpp b/libs/ui/DisplayIdentification.cpp index 82e5427317..0908ae85a8 100644 --- a/libs/ui/DisplayIdentification.cpp +++ b/libs/ui/DisplayIdentification.cpp @@ -23,67 +23,13 @@ #include #include +#include #include - #include namespace android { namespace { -template -inline T load(const void* p) { - static_assert(std::is_integral::value, "T must be integral"); - - T r; - std::memcpy(&r, p, sizeof(r)); - return r; -} - -uint64_t rotateByAtLeast1(uint64_t val, uint8_t shift) { - return (val >> shift) | (val << (64 - shift)); -} - -uint64_t shiftMix(uint64_t val) { - return val ^ (val >> 47); -} - -__attribute__((no_sanitize("unsigned-integer-overflow"))) -uint64_t hash64Len16(uint64_t u, uint64_t v) { - constexpr uint64_t kMul = 0x9ddfea08eb382d69; - uint64_t a = (u ^ v) * kMul; - a ^= (a >> 47); - uint64_t b = (v ^ a) * kMul; - b ^= (b >> 47); - b *= kMul; - return b; -} - -__attribute__((no_sanitize("unsigned-integer-overflow"))) -uint64_t hash64Len0To16(const char* s, uint64_t len) { - constexpr uint64_t k2 = 0x9ae16a3b2f90404f; - constexpr uint64_t k3 = 0xc949d7c7509e6557; - - if (len > 8) { - const uint64_t a = load(s); - const uint64_t b = load(s + len - 8); - return hash64Len16(a, rotateByAtLeast1(b + len, static_cast(len))) ^ b; - } - if (len >= 4) { - const uint32_t a = load(s); - const uint32_t b = load(s + len - 4); - return hash64Len16(len + (a << 3), b); - } - if (len > 0) { - const unsigned char a = static_cast(s[0]); - const unsigned char b = static_cast(s[len >> 1]); - const unsigned char c = static_cast(s[len - 1]); - const uint32_t y = static_cast(a) + (static_cast(b) << 8); - const uint32_t z = static_cast(len) + (static_cast(c) << 2); - return shiftMix(y * k2 ^ z * k3) * k2; - } - return k2; -} - using byte_view = std::span; constexpr size_t kEdidBlockSize = 128; @@ -320,7 +266,7 @@ std::optional parseEdid(const DisplayIdentificationData& edid) { // Hash model string instead of using product code or (integer) serial number, since the latter // have been observed to change on some displays with multiple inputs. Use a stable hash instead // of std::hash which is only required to be same within a single execution of a program. - const uint32_t modelHash = static_cast(cityHash64Len0To16(modelString)); + const uint32_t modelHash = static_cast(*ftl::stable_hash(modelString)); // Parse extension blocks. std::optional cea861Block; @@ -394,13 +340,4 @@ PhysicalDisplayId getVirtualDisplayId(uint32_t id) { return PhysicalDisplayId::fromEdid(0, kVirtualEdidManufacturerId, id); } -uint64_t cityHash64Len0To16(std::string_view sv) { - auto len = sv.length(); - if (len > 16) { - ALOGE("%s called with length %zu. Only hashing the first 16 chars", __FUNCTION__, len); - len = 16; - } - return hash64Len0To16(sv.data(), len); -} - } // namespace android -- cgit v1.2.3-59-g8ed1b