我使用mysql数据库自动递增作为订单ID。当我向用户显示订单ID时,我想以某种方式屏蔽/模糊它。
为什么
- 所以乍一看,管理员用户很明显知道数字是多少指(订单以10开头,客户以20开头等)
- 乍一看,这只是我的第四个订单
基于这个答案,我希望屏蔽/模糊订单id为:
- 只是数字
- 长度一致(如果可能)
- 不会造成碰撞
- 是可逆的,这样我就可以解码并获得原始ID
我将如何在PHP中实现这一点?它不一定很复杂,只是乍一看并不明显。
我认为您可以使用XOR运算符来隐藏"第一眼",例如(MySQL示例):
(id*121) ^ 2342323
其中2342323
和121
是"魔术"数字-订单号的模板。要反转:
(OrderNum ^ 2342323)/121
在这种情况下的额外优势-如果(OrderNum ^ 2342323)
除以121而没有余数,则可以验证OrderNumber(以避免在线形式中的垃圾邮件或类似内容)。
SQLFiddle演示
有点晚了,但Optimus(https://github.com/jenssegers/optimus)按照这里的要求去做。
$encoded = $optimus->encode(20); // 1535832388
$original = $optimus->decode(1535832388); // 20
只有初始设置有点奇怪(生成素数)
最简单的方法可能是生成一个长随机字符串,并使用它来代替自动递增ID。或者可以将它与自动递增ID一起使用。如果字符串足够长且足够随机,则它对每个记录都是唯一的(想想GUID)。然后,您可以向用户显示这些内容,而不必担心任何事情。
它能帮上忙吗?
echo hexdec(uniqid());
当然,您应该将此值存储在db中,与订单id位于同一行。
仅仅将ID转换为类似HEX的东西可能不会得到您想要的结果。此外,它仍然很容易"猜测"
我想要一个额外的ID列(即order_ID)。设置unqi。指数然后on_create使用以下mysql函数之一:
SHA1(contcat('ORDER', id))
MD5(contcat('ORDER', id))
SHA1(contcat('ORDER', id, customer_id))
MD5(contcat('ORDER', id, customer_id))
UUID()
// try this in your mysql console
SELECT UUID(), SHA(CONCAT('ORDER',10)), SHA1(1);
您可以(如示例中所示)添加一个简单的文本前缀,如"order"。甚至把它们结合起来。然而,我认为UUID()将是最简单的。
实现在一定程度上取决于您喜欢什么——您可以使用存储过程)或将其合并到您的模型中