有趣!SKU 转化、还原算法的实际应用与数学原理

“SKU”在商业活动中几乎无处不在,开发过商品系统的开发者也一定接触过。简而言之,SKU就是商品编码,它在企业的系统体系内具有唯一性。

业务场景
有时,企业需要两套甚至多套的SKU,例如,编号为ABC的商品,在企业内部使用ABC作为编码,在大陆销售时用ABC-1,但在海外销售时用ABC-2。甚至,由于业务需要,每套编码要看起来完全没有关联、没有规律可循,例如,编码ABC转化后变成CKR。

问题
在信息化系统中,要如何架构商品的SKU模块,以保证相关的SKU最终能够回溯到原初的那个SKU编码?

方案

方法 说明 优劣
数据库记录 一一对应记录原始SKU和转化后的SKU。 数据量大、需要保全关联数据的安全。
算法 算法能够将SKU转化成输出编码,同时输出编码也能还原成原始SKU。 无需数据库、只需保证初始配置、算法不泄露。

我采用的是“算法”的方案:SKU有且只有一套,针对不同的应用场景配置不同的算法,得到新的SKU;反之,算法逆运算也能从新SKU还原出原始SKU(简称原SKU)。

算法

格式约束
SKU只允许由字母、数字、横杆线组成,横杆线不参与格式转化。

单元编码(转化原料)
字母(序列): ABCDEFGHIJKLMNOPQRSTUVWXYZ
数字(序列): 0123456789
符号(序列): -

示例
原SKU: X-A68NB

偏移法
这是最简单的算法。假设偏移值为2,那么A转化为C,Z转化为B,6转化为8,8转化为0,以此类推。负数偏移的情形也是一样,D转化为B,5转化为3。

翻转法
想象一下单元编码中的字母都写在纸张上,将纸张180°翻转后,得到倒序排列的字母序列:Z-A。两个序列字母数量一样,原序列中的每个字母根据自身的位置都能在倒序序列中找到对应字母,本文中,我将这种方式称作“倒序匹配”。数字的情形也是一样,值得一题的是,每个字母(或数字)在倒序序列中对应的字母一定和自己不一样,因为字母的总数是偶数。
翻转法,就是用倒序序列中的对应字母、数字替代原来的字母、数字。例如,A转化为Z,4转化为5,0转化为9。

数学原理
翻转其实也是偏移法,只是计算的方式有区,偏移法是在直接偏移原有的位置,翻转法是用原位置到终点的距离作为偏移值。例如,X在26个字母中的位置是24,它和终点字母Z有2个偏移的距离。
单元编码是有序的,算法规则也是有序并且可逆的,那么所有的设计算法这一定也是有序的。算法的本质,是找出单个字符的对应字符,其方法不是在有序的原序列中找对应字符,就是在有序的倒序序列中找对应字符。据此分析,我们可以推断:偏移法是所有复杂算法的根基,其他算法最终肯定会使用到偏移法。

高级算法

混合法
偏移翻转或翻转偏移,前者是先偏移再翻转,后者是先翻转再偏移。

截断偏移法
假设截断点为3,那么,前3位按照偏移值“2”转化,3位之后的字符都按照“-1”的偏移值转化。

截断翻转偏移法
假设截断点为3,那么,前3位用偏移法,3位之后用翻转法。

奇偶数位置混合法
每个字符在原序列中的位置,不是奇数就是偶数,如果偏移值是奇数,那么转化后,奇数位置一定变为偶数位置,,偶数位置也变为奇数位置。例如,偏移值为1,那么A将转化为B,位置由偶数0变为奇数1,4转化为5,位置由奇数5变为偶数6。
同时,一旦使用翻转法,奇数位置的字符转化后的字母在原序列中一定是偶数位置,反之也成立。例如,A的位置是0,翻转后是Z,位置是25;7的位置是7,翻转后是位置为2的2。
基于上述特征,当偏移值为奇数时,偶数位置的字符采用翻转法,强制转化为奇数位置的字符,奇数位置的字符采用偏移法,位置转化为偶数。还原的时候,则要按照偶数偏移成奇数、奇数翻转成偶数的规则。

更多
现在,我们能够基于最基本“偏移法”开始衍生出更多复杂的算法,但务必保证算法是可逆的。假设使用“甲->乙->丙”3个方法转换出新SKU,还原的时候就必须要以“丙->乙->甲”的顺序转化,否则算法有误。

实用
事实上,不需要那么多眼花缭乱的算法,单凭“偏移法”就能够转化出和原SKU毫无关联的新SKU,仅需要打乱单元编码:
字母(序列): KCEBHFGAMZJLNODYSQITUVPXRW
数字(序列): 1024573968

然而,这些分析不仅有趣、锻炼思维,而且能够练习代码的构架能力,这才是真正的乐趣。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

文章很新颖,没做过此类的表示长见识了

6年前 评论
滕勇志

现代密码学里面的置换密码和凯撒密码... :smile:

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!