我正在尝试为我的电子商务应用程序生成一个唯一的订单号,这是我的代码:
<?php
$bytes = random_bytes(3);
$random_hash = bin2hex($bytes);
$order_num = $random_hash . "1";
echo strtoupper(hash('crc32b', $order_num));
订单号(在示例中为1)将是从MySQL检索的自动增量值。 这样可以确保我的独特性吗?
我想要一个最大8-10个字符的唯一最终值。 唯一的数字解决方案也可以。
答案 0 :(得分:0)
据我所知,大多数哈希算法无法保证何时会发生冲突,因此您可能与拟议代码发生冲突的可能性就如同自己单独使用随机部分一样。
如果自动递增部分是唯一的,而随机部分只是为了避免猜测,则可以将两个部分连接在一起(即,在hash
调用之前示例中的所有内容)。这样,如果相同的随机数出现两次,则最后将有不同的数字。
如果结果太长,则可以使用base_convert
或asc
进行一些操作,以将数字转换为较短的表示形式。
答案 1 :(得分:0)
hash函数不会为id提供任何唯一性,只会稍微混淆id。
如果您说100个可能的值,则不会再从中获得100个可能的哈希值。如果攻击者想强行使用哈希,他可以选择100种可能的哈希并进行尝试。
在具有3个字节随机性的情况下,在获得重复项之前,您将无法获得所有可能的组合。因此,与3个字节的可能组合相比,生成同一随机数的时间要早得多。
关于唯一ID,有两种常见方法:
UUID有很多优点和缺点: