在我的数据库中,我需要为订单提供唯一的参考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())
}
这有多随机? 我该如何验证?
由于
答案 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:
没有冲突,因为该方法基于整数到十六进制的转换。只要您中途不更改构造函数参数,生成的输出将对您的盐保持唯一。
此外,我们建议您为测试目的预先生成大量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使链接共享无法实现。长度也一样!