从 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的主要内容,如果未能解决你的问题,请参考以下文章