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 Workerinline 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 Workerinline 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 Workeruint64_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 Workeruint32_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 Workeruint32_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