使用Hashids生成唯一引用ID

时间:2018-02-12 17:18:05

标签: mysql node.js hashids

在我的数据库中,我需要为订单提供唯一的参考ID,以显示最终用户。

我的架构包含许多可能拥有许多客户的帐户,这些客户可以订购许多订单(偶尔会同时订购 - 不同的客户,以及订单多的客户)

我决定使用Hashids来解决这个问题。我想出了这个:

//create a unique salt using the account id + current timestamp:
var hashids = new Hashids(accountId + '-' + new Date().getTime(), 8,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')

//Then, generate a unique id for every order using:
for(var i = 0; i < orders.length; i++ ) {
   orders[i].ref_number = hashids.encode(i, a.date.getTime())
}

这有多随机? 我该如何验证?

由于

2 个答案:

答案 0 :(得分:1)

  

相同长度的唯一ID字符串,我可以向最终用户显示,以便他们可以引用他们的订单

客户ID和自动递增订单ID的串联怎么样?

假设你的表是:

CREATE TABLE `orders` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `cust_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`order_id`)
);

有了这些数据:

insert into orders values (8675309, 123);

您可以创建一个VIEW来生成客户对订单的引用:

CREATE OR REPLACE VIEW cust_orders_ref AS
SELECT CONCAT(LPAD(cust_id, 4, '0'), '-', LPAD(order_id, 11, '0')) AS order_ref
FROM orders;

输出:

select * from cust_ref;
+------------------+
| order_ref        |
+------------------+
| 0123-00008675309 |
+------------------+

答案 1 :(得分:0)

这比你想象的要简单。来自Hashids的documentation

1)盐不应该是随机的,以避免碰撞

  

没有冲突,因为该方法基于整数到十六进制的转换。只要您中途不更改构造函数参数,生成的输出将对您的盐保持唯一。

2)检查ID看起来的随机性

  

此外,我们建议您为测试目的预先生成大量ID,以分析它们的唯一性,它们是否对您的项目看起来是随机的,以及您的上限整数(通常取决于您的系统/语言) )。

这里有一个如何预生成大量id的示例:

const salt = 'my salt'
const idsLength = 10
const hashids = new Hashids(salt, idsLength)

let idsCollector = []

for (let i = 0; i < 1000; i++) {
  idsCollector.push(hashids.encode(i))
}

console.log(idsCollector)
<script src="https://cdn.jsdelivr.net/npm/hashids@1.1.4/dist/hashids.min.js"></script>

记住!定义salt变量时, 对所有用户和会话保持相同,如果不是每个用户都有不同的哈希值id使链接共享无法实现。长度也一样!