首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >散列一个随机值加上一个自动递增的数字能确保唯一性吗?

散列一个随机值加上一个自动递增的数字能确保唯一性吗?
EN

Stack Overflow用户
提问于 2019-04-12 20:33:06
回答 2查看 255关注 0票数 0

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

代码语言:javascript
运行
复制
<?php
 $bytes = random_bytes(3);
 $random_hash = bin2hex($bytes);
 $order_num = $random_hash . "1";
 echo strtoupper(hash('crc32b', $order_num));

订单号(在本例中为1)将是从MySQL检索到的自动增量值。这能确保我的唯一性吗?

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

EN

回答 2

Stack Overflow用户

发布于 2019-04-12 21:16:36

据我所知,大多数散列算法不能保证冲突可能发生的时间,所以你很可能会与你的建议代码发生冲突,就像使用随机部分一样。

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

如果结果太长,您可以使用base_convertasc将数字转换为较短的表示形式。

票数 0
EN

Stack Overflow用户

发布于 2019-04-15 18:11:38

哈希函数不会为id提供任何唯一性,它只是稍微混淆了id。

如果你有100个可能的值,你将从它们中得到100个可能的哈希,不会更多。如果攻击者想要暴力破解哈希,他可以选择100个可能的哈希并尝试它们。

在具有3字节随机性的情况下,在获得副本之前,您不会获得所有可能的组合。因此,与3个字节的可能组合相比,将更早地生成相同的随机数。

当涉及到唯一ids时,有两种常见的方法:

  1. 你让数据库自动递增id,这确保了id的唯一性。
  2. 你生成了一个UUID ( 16字节的全局id ),它提供了如此大的键空间,以至于重复的可能性极小。在实践中,人们可以忽略重复的可能性。

UUID有很多优点,但也有一个缺点:

  • (+) UUID可以分散工作,例如在脱机情况下。
  • (+)用户可以在将其插入数据库之前生成id,因此在数据库中创建行之前不必等待。
  • (+)id不是确定性的,因此攻击者无法猜测下一个id。
  • (-)它们使用更多的存储空间,并且搜索时速度较慢。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55651726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档