我正在尝试为我的电子商务应用生成唯一的订单号,这是我的代码:
<?php
$bytes = random_bytes(3);
$random_hash = bin2hex($bytes);
$order_num = $random_hash . "1";
echo strtoupper(hash('crc32b', $order_num));
订单号(在示例中为1)将是从MySQL检索的自动增量值。这确保了我的独特性吗?
我想要一个短的最大8-10个字符唯一的最终值。唯一的数字解决方案也可以。
据我所知,大多数哈希算法都不能保证何时可能发生冲突,因此您可能会像使用随机部分一样与您提出的代码发生冲突。
如果自动增量部分是唯一的,并且随机部分只是为了避免猜测,你可以将两个部分连接在一起(即在hash
调用之前示例中的所有内容)。这样,如果相同的随机数出现两次,则最终会有不同的数字。
如果这导致某些事情太长,您可以使用base_convert
或asc
将数字转换为更短的表示形式。
散列函数不会为id提供任何唯一性,它只会对id进行模糊处理。
如果你有100个可能的值,那么你将获得100个可能的哈希值,而不是更多。如果攻击者想要对哈希进行暴力破解,他可以选择100个可能的哈希并尝试它们。
对于3字节随机性的情况,在获得重复之前,您将无法获得所有可能的组合。因此,与3个字节的可能组合相比,可以更早地生成相同的随机数。
对于唯一ID,有两种常见方法:
UUID有很多优点和缺点: