从 PHP 中的 UUID 数组中获取唯一的哈希 ID

Posted

技术标签:

【中文标题】从 PHP 中的 UUID 数组中获取唯一的哈希 ID【英文标题】:Getting an unique hash ID from array of UUIDs in PHP 【发布时间】:2021-07-29 22:16:49 【问题描述】:

为 UUID 数组创建唯一标识符的最佳方法是什么?

我有一个由多个组件组成的产品,每个组件都有一个分配给它的 UUID。

在使用其组件创建新产品时,我需要知道是否已经有另一个产品具有完全相同的组件。我认为通过 mysql,加载每个产品及其组件并一一检查它们会很耗时。

这是我的想法:

products table
--------------
id, name, components_uuid_hash

product_components table
------------------------
product_id, component_id, ...

components table
----------------
id, uuid, name, ...

我会计算components_uuid_hash

$product_component_uuids = ['227A0140-F0FB-4FDA-B780-85152AB02927', 'FA0E6D52-F0E4-4F55-87F5-8D73625AEDA3'];

sort($product_component_uuids);

$component_uuid_hash = md5(serialize($product_component_uuids));

我会为每个产品执行此操作,为我提供整个 UUID 数组的唯一哈希,我可以简单地在 Products table 中查找,以了解是否已经存在具有相同哈希的不同产品。

有人可以确认这是否可行,或者是否有其他更好的方法?

【问题讨论】:

它会工作 :) 您也可以在单个查询中执行此操作(即无需在 php 端加载所有内容),但它无法使用索引(它需要表之间的完整连接并进行完整扫描)。 可能不需要使用序列化,因为它添加了无关数据。 md5(implode(",",$product_component_uuids)) 应该也可以工作 @obe 谢谢,我只是有点害怕在sort() 函数上进行中继,但使用 UUID 应该不是问题。我忘了提到,我需要对照现有产品检查的那些组件 UUID 也来自 XML 中的第 3 方软件,并且有超过 15k 的产品,每个产品有 50 个组件,我希望最大限度地降低查询的复杂性。保存散列并索引列应该足够快。 @DobromirVelev 你是对的,我实际上是在考虑用逗号分隔 UUID,但由于某种原因,将它从数组中序列化感觉更合适哈哈,尽管它没有多大意义这里 【参考方案1】:

假设您已经有一个 uuid 列表,您可以尝试在 MySQL 中使用类似

select pc.product_id, count(c.id) as co from 
product_components pc left join components c on (
  pc.component_id=c.id and
  c.uuid in ('227A0140-F0FB-4FDA-B780-85152AB02927', 'FA0E6D52-F0E4-4F55-87F5-8D73625AEDA3')
) 
group by pc.product_id having co=2;

这将返回恰好有两个组件且 UUID 与列表中的组件匹配的所有产品。

你需要调整最后的计数值以匹配 uuid 的数量。 这仍将对 product_components 表进行完整扫描,并且可能会使用临时表,因此您计划在 products 表中保留 UUID 的哈希并通过它进行搜索从 MySQL 的角度来看可能会更快,但是您每次产品或组件更改时都必须更新它。

【讨论】:

谢谢,是的,正如我在上面的评论中所说,我有大约 15k 个产品,每个产品包含 50 多个组件,所以我希望搜索尽可能轻量级。尽管您提供的查询确实很有用,但我一定会保存以备后用。我完全忘记了having 子句。我也不需要担心重新生成哈希,因为它会在产品在系统中获得批准时计算,并且从那时起组件将无法更改。

以上是关于从 PHP 中的 UUID 数组中获取唯一的哈希 ID的主要内容,如果未能解决你的问题,请参考以下文章

stout代码分析之五:UUID类

如何展平哈希,使每个键成为唯一值?

如何在数组元素中搜索哈希键中的匹配项

获取哈希中唯一条目的值[重复]

PHP安装UUID扩展

从哪里获取已部署 iBeacon 设备的 UUID?