我正在尝试为我的电子商务应用程序生成一个唯一的订单号,这是我的代码:
<?php
$bytes = random_bytes(3);
$random_hash = bin2hex($bytes);
$order_num = $random_hash . "1";
echo strtoupper(hash('crc32b', $order_num));
订单号(在本例中为1)将是从MySQL检索到的自动增量值。这能确保我的唯一性吗?
我想要一个简短的最大8-10个字符的唯一最终值。一个只有数字的解决方案也是可以的。
发布于 2019-04-12 21:16:36
据我所知,大多数散列算法不能保证冲突可能发生的时间,所以你很可能会与你的建议代码发生冲突,就像使用随机部分一样。
如果自动增量部分是唯一的,而随机部分只是为了避免猜测,那么您可以将这两个部分连接在一起(即,在hash
调用之前,示例中的所有内容)。这样,如果相同的随机数出现两次,它的末尾就会有不同的数字。
如果结果太长,您可以使用base_convert
或asc
将数字转换为较短的表示形式。
发布于 2019-04-15 18:11:38
哈希函数不会为id提供任何唯一性,它只是稍微混淆了id。
如果你有100个可能的值,你将从它们中得到100个可能的哈希,不会更多。如果攻击者想要暴力破解哈希,他可以选择100个可能的哈希并尝试它们。
在具有3字节随机性的情况下,在获得副本之前,您不会获得所有可能的组合。因此,与3个字节的可能组合相比,将更早地生成相同的随机数。
当涉及到唯一ids时,有两种常见的方法:
UUID有很多优点,但也有一个缺点:
https://stackoverflow.com/questions/55651726
复制相似问题