114cf0368Sopenharmony_ci/*
214cf0368Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
314cf0368Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
414cf0368Sopenharmony_ci * you may not use this file except in compliance with the License.
514cf0368Sopenharmony_ci * You may obtain a copy of the License at
614cf0368Sopenharmony_ci *
714cf0368Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
814cf0368Sopenharmony_ci *
914cf0368Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1014cf0368Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1114cf0368Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1214cf0368Sopenharmony_ci * See the License for the specific language governing permissions and
1314cf0368Sopenharmony_ci * limitations under the License.
1414cf0368Sopenharmony_ci */
1514cf0368Sopenharmony_ci#include "udmf_utils.h"
1614cf0368Sopenharmony_ci#include <random>
1714cf0368Sopenharmony_ci#include <sstream>
1814cf0368Sopenharmony_ci
1914cf0368Sopenharmony_cinamespace OHOS {
2014cf0368Sopenharmony_cinamespace UDMF {
2114cf0368Sopenharmony_cinamespace UTILS {
2214cf0368Sopenharmony_cistatic constexpr int ID_LEN = 32;
2314cf0368Sopenharmony_cistatic constexpr int MINIMUM = 48;
2414cf0368Sopenharmony_cistatic constexpr int MAXIMUM = 121;
2514cf0368Sopenharmony_ciconstexpr char SPECIAL = '^';
2614cf0368Sopenharmony_ci
2714cf0368Sopenharmony_cistd::vector<std::string> StrSplit(const std::string &str, const std::string &delimiter)
2814cf0368Sopenharmony_ci{
2914cf0368Sopenharmony_ci    std::vector<std::string> result;
3014cf0368Sopenharmony_ci    size_t start = 0;
3114cf0368Sopenharmony_ci    size_t end = str.find(delimiter);
3214cf0368Sopenharmony_ci    while (end != std::string::npos) {
3314cf0368Sopenharmony_ci        result.push_back(str.substr(start, end - start));
3414cf0368Sopenharmony_ci        start = end + delimiter.length();
3514cf0368Sopenharmony_ci        end = str.find(delimiter, start);
3614cf0368Sopenharmony_ci    }
3714cf0368Sopenharmony_ci    result.push_back(str.substr(start));
3814cf0368Sopenharmony_ci    return result;
3914cf0368Sopenharmony_ci}
4014cf0368Sopenharmony_ci
4114cf0368Sopenharmony_cistd::vector<uint8_t> Random(int32_t len, int32_t minimum, int32_t maximum)
4214cf0368Sopenharmony_ci{
4314cf0368Sopenharmony_ci    std::random_device randomDevice;
4414cf0368Sopenharmony_ci    std::uniform_int_distribution<int> distribution(minimum, maximum);
4514cf0368Sopenharmony_ci    std::vector<uint8_t> key(len);
4614cf0368Sopenharmony_ci    for (int32_t i = 0; i < len; i++) {
4714cf0368Sopenharmony_ci        key[i] = static_cast<uint8_t>(distribution(randomDevice));
4814cf0368Sopenharmony_ci    }
4914cf0368Sopenharmony_ci    return key;
5014cf0368Sopenharmony_ci}
5114cf0368Sopenharmony_ci
5214cf0368Sopenharmony_cistd::string GenerateId()
5314cf0368Sopenharmony_ci{
5414cf0368Sopenharmony_ci    std::vector<uint8_t> randomDevices = Random(ID_LEN, MINIMUM, MAXIMUM);
5514cf0368Sopenharmony_ci    std::stringstream idStr;
5614cf0368Sopenharmony_ci    for (auto &randomDevice : randomDevices) {
5714cf0368Sopenharmony_ci        auto asc = randomDevice;
5814cf0368Sopenharmony_ci        asc = asc >= SPECIAL ? asc + 1 : asc;
5914cf0368Sopenharmony_ci        idStr << static_cast<uint8_t>(asc);
6014cf0368Sopenharmony_ci    }
6114cf0368Sopenharmony_ci    return idStr.str();
6214cf0368Sopenharmony_ci}
6314cf0368Sopenharmony_ci} // namespace UTILS
6414cf0368Sopenharmony_ci} // namespace UDMF
6514cf0368Sopenharmony_ci} // namespace OHOS