1 /* 2 * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "rtc_base/unique_id_generator.h" 12 13 #include <limits> 14 #include <vector> 15 16 #include "absl/strings/string_view.h" 17 #include "rtc_base/helpers.h" 18 #include "rtc_base/string_encode.h" 19 #include "rtc_base/string_to_number.h" 20 21 namespace rtc { 22 UniqueRandomIdGenerator()23UniqueRandomIdGenerator::UniqueRandomIdGenerator() : known_ids_() {} UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids)24UniqueRandomIdGenerator::UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids) 25 : known_ids_(known_ids.begin(), known_ids.end()) {} 26 27 UniqueRandomIdGenerator::~UniqueRandomIdGenerator() = default; 28 GenerateId()29uint32_t UniqueRandomIdGenerator::GenerateId() { 30 webrtc::MutexLock lock(&mutex_); 31 32 RTC_CHECK_LT(known_ids_.size(), std::numeric_limits<uint32_t>::max() - 1); 33 while (true) { 34 auto pair = known_ids_.insert(CreateRandomNonZeroId()); 35 if (pair.second) { 36 return *pair.first; 37 } 38 } 39 } 40 AddKnownId(uint32_t value)41bool UniqueRandomIdGenerator::AddKnownId(uint32_t value) { 42 webrtc::MutexLock lock(&mutex_); 43 return known_ids_.insert(value).second; 44 } 45 UniqueStringGenerator()46UniqueStringGenerator::UniqueStringGenerator() : unique_number_generator_() {} UniqueStringGenerator(ArrayView<std::string> known_ids)47UniqueStringGenerator::UniqueStringGenerator(ArrayView<std::string> known_ids) { 48 for (const std::string& str : known_ids) { 49 AddKnownId(str); 50 } 51 } 52 53 UniqueStringGenerator::~UniqueStringGenerator() = default; 54 GenerateString()55std::string UniqueStringGenerator::GenerateString() { 56 return ToString(unique_number_generator_.GenerateNumber()); 57 } 58 AddKnownId(absl::string_view value)59bool UniqueStringGenerator::AddKnownId(absl::string_view value) { 60 // TODO(webrtc:13579): remove string copy here once absl::string_view version 61 // of StringToNumber is available. 62 absl::optional<uint32_t> int_value = 63 StringToNumber<uint32_t>(std::string(value)); 64 // The underlying generator works for uint32_t values, so if the provided 65 // value is not a uint32_t it will never be generated anyway. 66 if (int_value.has_value()) { 67 return unique_number_generator_.AddKnownId(int_value.value()); 68 } 69 return false; 70 } 71 72 } // namespace rtc 73