客户有一个简单的增加订单号(1,2,3 ......).他希望最终用户收到8位或9位数字(仅数字 - 无字符)"随机"数字.显然,这个"随机"数字实际上必须是唯一且可逆的(它实际上是对actualOrderNumber的加密).
我的第一个想法是只是洗牌一些.当我向客户展示一个样本序列时,他抱怨随后的obfuscOrderNumbers正在增加,直到它们达到"shuffle"点(低位比特发挥作用的点).他希望obfuscOrderNumbers尽可能随机看似.
我的下一个想法是确定性地播种线性同余伪随机数生成器,然后获取actualOrderNumber值.但在这种情况下,我需要担心碰撞 - 客户想要一种保证不会在至少10 ^ 7个周期内发生碰撞的算法.
我的第三个想法是"呃,只是对加密的东西进行加密",但如果我使用股票加密库,我必须对其进行后期处理才能获得8位或9位数的要求.
我的第四个想法是将actualOrderNumber的位解释为格雷编码的整数并返回.
我的第五个问题是:"我可能会过度思考这个问题.我敢打赌,StackOverflow上的某个人可以用几行代码完成这项工作."
随机选择一个8位或9位数字,比如839712541.然后,取你的订单号的二进制表示(对于这个例子,我没有使用2的补码),将其填充到相同的位数(30),反转它,和xor翻转的订单号和幻数.例如:
1 = 000000000000000000000000000001 Flip = 100000000000000000000000000000 839712541 = 110010000011001111111100011101 XOR = 010010000011001111111100011101 = 302841629 2 = 000000000000000000000000000010 Flip = 010000000000000000000000000000 839712541 = 110010000011001111111100011101 XOR = 100010000011001111111100011101 = 571277085
要获取订单号,请输出带有幻数的输出数,转换为位串,然后反转.
哈希函数? http://www.partow.net/programming/hashfunctions/index.html
客户是否需要分配模糊的连续订单号以使其看起来像什么?
如果您不想使用加密复杂化,请使用位混洗和一些随机salting的组合(如果您有多余的位/数字)XOR叠加在一些固定常量(或某些功能很容易的东西上)随时可以使用模糊的订单ID,例如可能是customer_id
谁下了订单?)
编辑
似乎所有客户的愿望都是外部方无法推断销售进度.在这种情况下,改组解决方案(比特映射,例如原始比特1映射到模糊比特6,原始比特6映射到模糊比特3等)应该是绰绰有余的.如果您真的想要使其更难破解,请添加一些随机位,前提是您有额外的位可用(例如,假设原始订单号最多只能达到6位数,但在混淆的订单号中允许8-9,然后你可以在执行位映射之前使用2-3位数字进行随机性处理.可能会对结果进行XOR以进行额外的恐吓(一个好奇的一方可能会尝试生成两个连续的混淆命令,将它们相互异或,以消除XOR常数,
EDIT2
当然,您可以为混淆的订单ID分配完全随机的数字,将对应关系存储到持久存储(例如DB),并执行冲突检测以及针对相同存储的去混淆.矫枉过正的一点,如果你问我,但加方是最好尽可能模糊变(和你实现取其分布函数,你的灵魂渴望,并且可以更改分布函数任何时候你喜欢.)