在我的数据库中,我需要对订单有唯一的参考ID,以向最终用户展示。
我的模式包含许多可能有许多客户的帐户,这些客户可能会发出许多订单(偶尔同时 - 既有不同的客户,又有许多订单的客户(
我决定使用桥梁来解决此问题。我想到了:
//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())
}
这将有多随机?我该如何验证?
谢谢
我可以向最终用户显示的相同长度,唯一的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);
您可以创建一个视图来产生客户对订单的参考:
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 |
+------------------+
它比您想象的要简单。从Hashids的文档中:
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
变量时,具有对所有用户和会话保持相同不可能的。长度也是如此!