1*635a8641SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_TOKEN_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_TOKEN_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <iosfwd> 11*635a8641SAndroid Build Coastguard Worker #include <tuple> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h" 14*635a8641SAndroid Build Coastguard Worker #include "base/hash.h" 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker namespace base { 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker // A Token is a randomly chosen 128-bit integer. This class supports generation 19*635a8641SAndroid Build Coastguard Worker // from a cryptographically strong random source, or constexpr construction over 20*635a8641SAndroid Build Coastguard Worker // fixed values (e.g. to store a pre-generated constant value). Tokens are 21*635a8641SAndroid Build Coastguard Worker // similar in spirit and purpose to UUIDs, without many of the constraints and 22*635a8641SAndroid Build Coastguard Worker // expectations (such as byte layout and string representation) clasically 23*635a8641SAndroid Build Coastguard Worker // associated with UUIDs. 24*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT Token { 25*635a8641SAndroid Build Coastguard Worker public: 26*635a8641SAndroid Build Coastguard Worker // Constructs a zero Token. Token()27*635a8641SAndroid Build Coastguard Worker constexpr Token() : high_(0), low_(0) {} 28*635a8641SAndroid Build Coastguard Worker 29*635a8641SAndroid Build Coastguard Worker // Constructs a Token with |high| and |low| as its contents. Token(uint64_t high,uint64_t low)30*635a8641SAndroid Build Coastguard Worker constexpr Token(uint64_t high, uint64_t low) : high_(high), low_(low) {} 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker // Constructs a new Token with random |high| and |low| values taken from a 33*635a8641SAndroid Build Coastguard Worker // cryptographically strong random source. 34*635a8641SAndroid Build Coastguard Worker static Token CreateRandom(); 35*635a8641SAndroid Build Coastguard Worker 36*635a8641SAndroid Build Coastguard Worker // The high and low 64 bits of this Token. high()37*635a8641SAndroid Build Coastguard Worker uint64_t high() const { return high_; } low()38*635a8641SAndroid Build Coastguard Worker uint64_t low() const { return low_; } 39*635a8641SAndroid Build Coastguard Worker is_zero()40*635a8641SAndroid Build Coastguard Worker bool is_zero() const { return high_ == 0 && low_ == 0; } 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker bool operator==(const Token& other) const { 43*635a8641SAndroid Build Coastguard Worker return high_ == other.high_ && low_ == other.low_; 44*635a8641SAndroid Build Coastguard Worker } 45*635a8641SAndroid Build Coastguard Worker 46*635a8641SAndroid Build Coastguard Worker bool operator!=(const Token& other) const { return !(*this == other); } 47*635a8641SAndroid Build Coastguard Worker 48*635a8641SAndroid Build Coastguard Worker bool operator<(const Token& other) const { 49*635a8641SAndroid Build Coastguard Worker return std::tie(high_, low_) < std::tie(other.high_, other.low_); 50*635a8641SAndroid Build Coastguard Worker } 51*635a8641SAndroid Build Coastguard Worker 52*635a8641SAndroid Build Coastguard Worker // Generates a string representation of this Token useful for e.g. logging. 53*635a8641SAndroid Build Coastguard Worker std::string ToString() const; 54*635a8641SAndroid Build Coastguard Worker 55*635a8641SAndroid Build Coastguard Worker private: 56*635a8641SAndroid Build Coastguard Worker // Note: Two uint64_t are used instead of uint8_t[16] in order to have a 57*635a8641SAndroid Build Coastguard Worker // simpler implementation, paricularly for |ToString()|, |is_zero()|, and 58*635a8641SAndroid Build Coastguard Worker // constexpr value construction. 59*635a8641SAndroid Build Coastguard Worker uint64_t high_; 60*635a8641SAndroid Build Coastguard Worker uint64_t low_; 61*635a8641SAndroid Build Coastguard Worker }; 62*635a8641SAndroid Build Coastguard Worker 63*635a8641SAndroid Build Coastguard Worker // For use in std::unordered_map. 64*635a8641SAndroid Build Coastguard Worker struct TokenHash { operatorTokenHash65*635a8641SAndroid Build Coastguard Worker size_t operator()(const base::Token& token) const { 66*635a8641SAndroid Build Coastguard Worker return base::HashInts64(token.high(), token.low()); 67*635a8641SAndroid Build Coastguard Worker } 68*635a8641SAndroid Build Coastguard Worker }; 69*635a8641SAndroid Build Coastguard Worker 70*635a8641SAndroid Build Coastguard Worker } // namespace base 71*635a8641SAndroid Build Coastguard Worker 72*635a8641SAndroid Build Coastguard Worker #endif // BASE_TOKEN_H_