// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). // #include "util/random.h" #include #include #include #include #include #include "port/likely.h" #include "util/aligned_storage.h" #include "util/thread_local.h" #define STORAGE_DECL static thread_local namespace ROCKSDB_NAMESPACE { Random* Random::GetTLSInstance() { STORAGE_DECL Random* tls_instance; STORAGE_DECL aligned_storage::type tls_instance_bytes; auto rv = tls_instance; if (UNLIKELY(rv == nullptr)) { size_t seed = std::hash()(std::this_thread::get_id()); rv = new (&tls_instance_bytes) Random((uint32_t)seed); tls_instance = rv; } return rv; } std::string Random::HumanReadableString(int len) { std::string ret; ret.resize(len); for (int i = 0; i < len; ++i) { ret[i] = static_cast('a' + Uniform(26)); } return ret; } std::string Random::RandomString(int len) { std::string ret; ret.resize(len); for (int i = 0; i < len; i++) { ret[i] = static_cast(' ' + Uniform(95)); // ' ' .. '~' } return ret; } std::string Random::RandomBinaryString(int len) { std::string ret; ret.resize(len); for (int i = 0; i < len; i++) { ret[i] = static_cast(Uniform(CHAR_MAX)); } return ret; } } // namespace ROCKSDB_NAMESPACE