如何正确区分新生成的唯一ID和所有ID的完整列表?

时间:2018-06-28 02:57:13

标签: php arrays compare uuid

我具有用于生成唯一ID的示例功能:

void remove1(int id) {
    std::unique_lock<std::shared_mutex> lock(mutex_);
    for (auto it = models_.begin(); it != models_.end(); ++it)
        if ((*it)->getId() == id)
        {
            it = models_.erase(it);
            return;
        {
}

void remove2(int id) {
    std::shared_lock<std::shared_mutex> sharedLock(mutex_);
    for (auto it = models_.begin(); it != models_.end(); ++it)
        if ((*it)->getId() == id)
        {
            sharedLock.unlock();
            std::unique_lock<std::shared_mutex> uniqueLock(mutex_);
            models_.erase(it);
            return;
        }
}

我在数据库上有以下唯一ID:

function generate_uuid($needed_ids_num = 1, int $random_bytes_length = 6)
{
    $ids = [];
    while (count($ids) < $needed_ids_num) {
      $id = bin2hex(random_bytes($random_bytes_length));

      if (!isset($ids[$id])) $ids[$id] = true;
    }
    $ids = array_keys($ids);
    return $ids;
}

如何通过比较数据库中已经存在的标识符来生成唯一标识符?

我重写的变体函数是示例:

$ids_from_database = array(
    'ad5dcc895ddc',
    '3d036129b5b4',
    'db569298c1ea',
    'f919a34b31db'
);

为什么我编写的函数不能以不正确的变体形式返回结果数组?

1 个答案:

答案 0 :(得分:0)

如果我没有误解您的问题,我认为您的第一个功能还可以,在这种情况下$ids_from_database仅需要传递从数据库获得的ID。只需使用array_diff()计算数组之间的差,然后将结果传递给唯一ID和所有数据库ID。希望对您有所帮助。

<?php
function generate_uuid(array $ids_from_database, int $needed_ids_num = 1, int $random_bytes_length = 6)
{
    $temp = $ids_from_database;
    $ids = [];
    while (count($ids) < $needed_ids_num) {
        $id = bin2hex(random_bytes($random_bytes_length));
        if (!isset($ids[$id])) $ids[$id] = true;
    }
    $result = array_diff($ids, $temp);
    return [
        'new_uuid' => $result,
        'ids' => $temp
    ];
}
$ids_from_database = array(
    'ad5dcc895ddc',
    '3d036129b5b4',
    'db569298c1ea',
    'f919a34b31db'
);
$generated_ids = generate_uuid($ids_from_database);
print '<pre>';
print_r($generated_ids);
print '</pre>';
?>

演示: https://eval.in/1029502