散列随机值加上自动增量数是否确保唯一性?

问题描述 投票:0回答:2

我正在尝试为我的电子商务应用生成唯一的订单号,这是我的代码:

<?php
 $bytes = random_bytes(3);
 $random_hash = bin2hex($bytes);
 $order_num = $random_hash . "1";
 echo strtoupper(hash('crc32b', $order_num));

订单号(在示例中为1)将是从MySQL检索的自动增量值。这确保了我的独特性吗?

我想要一个短的最大8-10个字符唯一的最终值。唯一的数字解决方案也可以。

php hash
2个回答
0
投票

据我所知,大多数哈希算法都不能保证何时可能发生冲突,因此您可能会像使用随机部分一样与您提出的代码发生冲突。

如果自动增量部分是唯一的,并且随机部分只是为了避免猜测,你可以将两个部分连接在一起(即在hash调用之前示例中的所有内容)。这样,如果相同的随机数出现两次,则最终会有不同的数字。

如果这导致某些事情太长,您可以使用base_convertasc将数字转换为更短的表示形式。


0
投票

散列函数不会为id提供任何唯一性,它只会对id进行模糊处理。

如果你有100个可能的值,那么你将获得100个可能的哈希值,而不是更多。如果攻击者想要对哈希进行暴力破解,他可以选择100个可能的哈希并尝试它们。

对于3字节随机性的情况,在获得重复之前,您将无法获得所有可能的组合。因此,与3个字节的可能组合相比,可以更早地生成相同的随机数。

对于唯一ID,有两种常见方法:

  1. 您让数据库自动增加id,这可以确保id是唯一的。
  2. 您生成一个UUID(16字节的全局ID),它提供了如此庞大的密钥空间,重复的可能性极小。在实践中,人们可以否定重复的可能性。

UUID有很多优点和缺点:

  • (+)UUID可以分散工作,例如在离线场景中。
  • (+)可以在将id插入数据库之前生成id,因此在db中创建行之前不必等待。
  • (+)ID不是确定性的,因此攻击者无法猜测下一个id。
  • ( - )它们使用更多的存储空间,搜索时速度稍慢。
© www.soinside.com 2019 - 2024. All rights reserved.