xref: /aosp_15_r20/external/cronet/base/metrics/metrics_hashes.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/metrics/metrics_hashes.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <string_view>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/hash/md5.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/hash/sha1.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/numerics/byte_conversions.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace base {
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // Converts the 8-byte prefix of an MD5 hash into a uint64_t value.
DigestToUInt64(const MD5Digest & digest)21*6777b538SAndroid Build Coastguard Worker inline uint64_t DigestToUInt64(const MD5Digest& digest) {
22*6777b538SAndroid Build Coastguard Worker   return U64FromBigEndian(span(digest.a).first<8u>());
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // Converts the 4-byte prefix of an MD5 hash into a uint32_t value.
DigestToUInt32(const MD5Digest & digest)26*6777b538SAndroid Build Coastguard Worker inline uint32_t DigestToUInt32(const MD5Digest& digest) {
27*6777b538SAndroid Build Coastguard Worker   return U32FromBigEndian(span(digest.a).first<4u>());
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker }  // namespace
31*6777b538SAndroid Build Coastguard Worker 
HashMetricName(std::string_view name)32*6777b538SAndroid Build Coastguard Worker uint64_t HashMetricName(std::string_view name) {
33*6777b538SAndroid Build Coastguard Worker   // Corresponding Python code for quick look up:
34*6777b538SAndroid Build Coastguard Worker   //
35*6777b538SAndroid Build Coastguard Worker   //   import struct
36*6777b538SAndroid Build Coastguard Worker   //   import hashlib
37*6777b538SAndroid Build Coastguard Worker   //   struct.unpack('>Q', hashlib.md5(name.encode('utf-8')).digest()[:8])[0]
38*6777b538SAndroid Build Coastguard Worker   //
39*6777b538SAndroid Build Coastguard Worker   MD5Digest digest;
40*6777b538SAndroid Build Coastguard Worker   MD5Sum(as_byte_span(name), &digest);
41*6777b538SAndroid Build Coastguard Worker   return DigestToUInt64(digest);
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
HashMetricNameAs32Bits(std::string_view name)44*6777b538SAndroid Build Coastguard Worker uint32_t HashMetricNameAs32Bits(std::string_view name) {
45*6777b538SAndroid Build Coastguard Worker   MD5Digest digest;
46*6777b538SAndroid Build Coastguard Worker   MD5Sum(as_byte_span(name), &digest);
47*6777b538SAndroid Build Coastguard Worker   return DigestToUInt32(digest);
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
HashFieldTrialName(std::string_view name)50*6777b538SAndroid Build Coastguard Worker uint32_t HashFieldTrialName(std::string_view name) {
51*6777b538SAndroid Build Coastguard Worker   // SHA-1 is designed to produce a uniformly random spread in its output space,
52*6777b538SAndroid Build Coastguard Worker   // even for nearly-identical inputs.
53*6777b538SAndroid Build Coastguard Worker   SHA1Digest sha1_hash = SHA1HashSpan(as_byte_span(name));
54*6777b538SAndroid Build Coastguard Worker   return U32FromLittleEndian(span(sha1_hash).first<4u>());
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker }  // namespace base
58