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

时间:2019-04-12 12:33:06

标签: php hash

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

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

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

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

2 个答案:

答案 0 :(得分:0)

据我所知,大多数哈希算法无法保证何时会发生冲突,因此您可能与拟议代码发生冲突的可能性就如同自己单独使用随机部分一样。

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

如果结果太长,则可以使用base_convertasc进行一些操作,以将数字转换为较短的表示形式。

答案 1 :(得分:0)

hash函数不会为id提供任何唯一性,只会稍微混淆id。

如果您说100个可能的值,则不会再从中获得100个可能的哈希值。如果攻击者想强行使用哈希,他可以选择100种可能的哈希并进行尝试。

在具有3个字节随机性的情况下,在获得重复项之前,您将无法获得所有可能的组合。因此,与3个字节的可能组合相比,生成同一随机数的时间要早​​得多。

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

  1. 您让数据库自动增加ID,以确保ID是唯一的。
  2. 您生成一个UUID(具有16个字节的全局ID),该UUID提供了如此巨大的密钥空间,以至于极不可能发生重复。实际上,可以否定重复项的可能性。

UUID有很多优点和缺点:

  • (+)UUID可以分散运行,例如在离线情况下。
  • (+)一个人可以在将ID插入数据库之前生成ID,因此不必等到在数据库中创建该行。
  • (+)这些ID不确定,因此攻击者无法猜测下一个ID。
  • (-)它们使用更多的存储空间,并且在搜索时会变慢。