小编典典

如何使用实际订单ID生成唯一订单ID(仅向用户显示)?

algorithm

再次编辑:我不想创建另一个问题,所以在这里提问。 我有同样的情况。但是这次我需要使用C语言的算法。有谁能够帮我。

我有下表。

CREATE TABLE IF NOT EXISTS `j741_order` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `buyer_id` int(11) NOT NULL,
  `subtotal` decimal(15,5) DEFAULT '0.00000',
  `discount` decimal(15,5) NOT NULL DEFAULT '0.00000',
  `shipping` decimal(15,5) DEFAULT '0.00000',
  `tax` decimal(15,5) DEFAULT '0.00000',
  `total` decimal(15,5) NOT NULL DEFAULT '0.00000',
  `currency` char(3) DEFAULT NULL,
  `status` int(11) NOT NULL DEFAULT '0',
  `created_date` datetime NOT NULL,
  `modified_date` datetime NOT NULL,
  PRIMARY KEY (`order_id`),
  KEY `idx_buyer_id` (`buyer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我想生成一个唯一的订单ID(仅向用户显示),以便用户无法猜测下一个订单ID。

如何从原始订单中获取唯一随机订单ID,如果

并从该随机订单ID中获取原始订单ID?

编辑: 我不想创建任何其他字段。


阅读 822

收藏
2020-07-28

共1个答案

小编典典

如果您的要求是:

  • 它必须是可逆的(即 给出“随机” ID,您就可以找到原始的order_id)
  • 没有多余的列
  • 您根本不想向用户显示原始/内部order_id

那么我会建议某种双向加密。散列无法正常工作,因为您无法从散列中找到原始值。

我还要补充一点,它应该对人类友好,例如有人可以通过电话将其呼唤给您

我将使用一个位于此处的非常简单的双向加密类,该类由Tony
Marston编写。

我们希望该解决方案对人类友好,因此让我们删除一些混乱字符。我只剩下大写字母,数字,空格和破折号。使用标准的语音字母可以很容易地传达所有这些信息,并且大写字母的强制使用消除了关于字符是什么的任何混淆。

这些是我使用的加扰字符串(我使用此在线单词加扰器,而不是自己尝试加扰字符串):

    $this->scramble1 = '0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ ';
    $this->scramble2 = 'UKAH652LMOQ FBDIEG03JT17N4C89XPV-WRSYZ';

因此,创建我们人类友好的订单ID的代码为:

<?php

include 'encryption_class.php';

$crypt = new encryption_class();

$key = "A-COMPLETELY-RANDOM-KEY-THAT-I-HAVE-USED";
// Min length of 8 for encrypted string
$min_length = 8;

$order_id = 123456789;

print "Original: " . $order_id . PHP_EOL;

$encrypt_result = $crypt->encrypt($key, $order_id, $min_length);

print "Encrypted: " . $encrypt_result . PHP_EOL;

// DECRYPT
$decrypt_result = $crypt->decrypt($key, $encrypt_result);

print "Decrypted: " . $decrypt_result . PHP_EOL;

?>

(您需要下载 encryption_class 文件在本地并将其包含在内)。

我从命令行运行了该代码,并收到以下输出:

Original: 123456789
Encrypted: 2UD5UIK9S
Decrypted: 123456789

现在,我们有了一个简短的,对人类友好的order_id,可以在诸如http://myapp.example.com/order/view/2UD5UIK9S之类的URL中使用它,而您无需将内部的order_id显示或传达给用户。

笔记:

一旦您的order_id是唯一的,加密的代码就会是唯一的(因为它是PK,所以会是唯一的)

不应将其用作密码加密/解密例程-不要存储密码,存储哈希。

确保您的密钥是随机的,复杂的,并且 包含$ scramble变量中的字符。

它仅混淆order_id。

编辑:

尽管对输入字符串(order_id)进行填充会产生一定程度的随机性,但您可以将其与@biakaveron的答案结合起来以创建类似http://myapp.example.com/order/view/5cc46aea44e898c3b4e1303eb18d8161302cd367/2UD5UIK9S的URL

2020-07-28