0

在我的数据库中,我需要有唯一的订单参考 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())
}

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

谢谢

4

2 回答 2

1

它比你想象的要简单。从Hashids的文档中:

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

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

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,则无法进行链接共享。长度也是一样!

于 2018-02-19T23:59:59.497 回答
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 |
+------------------+
于 2018-02-12T17:40:21.727 回答