数据库设计 – 对于电子商务解决方案或付费Web服务,什么是良好的
考虑以下因素:
a)你想要一些机密性(因为没有告诉每个人你收到了多少订单). b)你想要一个校验位(例如,使用Verhoeff算法),这样你就可以很容易地告诉拼写错误并在扫描条形码时帮助处理错误,如果是这种情况的话. c)您需要考虑时间,以便消费者可以对订单的顺序进行排序. d)它应该是全数字还是十六进制等? e)由于安全问题,您的消费者可以通过电话向支持团队说出的内容足以识别订单而无需工作人员要求发送电子邮件等. 我很想听听一些意见. PS:任何为解决这个问题而设计的算法对我来说都算是一个有效的答案. 解决方法这是我的解决方案.有一个三部分x-y-z,其中x是时间戳,y是随机码,z是由x和y的串联产生的校验位.但是为了简化(使其更小),x和y在自定义基础中给出,而不是数字基础10,但是仍然在基数10给出z. 使用此方法可以获得的ID示例: > LP9NTX-8D41-QW6R-9 因此,您可以按时间戳排序(如果您不确切知道数字库是什么,请注意它是如何以’增量字母数字’顺序排列的). 为此,我使用了数字大写字母base58(最后,如果我使用小写或上部,这将无关紧要),这是base62没有一些令人困惑的字符. Flickr,bit.ly and others use base58 for making Twitter ‘friendly’ links and the like. 下面的Verhoeff :: calcsum是Verhoeff’s Dihedral Group D5 Check by Dahnielson.我唯一编辑的是将他的代码放在一个类中,所以它是一样的. 这里有一些代码:( *稍微改进了我在那里的承诺^) <?php $time_divisor = 3; $base = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";//consider using another base **see note below** $lower_limit = 50000;//just to avoiding to confuse the user with a lower number $upper_limit = 1291467968;//1291467968 == ZZZZZZ in this base I used //you can check the limit with base_decode("ZZZZZZ",$base); $ptime = (int)($_SERVER['REQUEST_TIME']/$time_divisor);//or time(); $rand1 = mt_rand($lower_limit,$upper_limi); $rand2 = mt_rand($lower_limit,$upper_limi); $ptime_b = base_encode($time,$base); $rand1_b = base_encode($rand1,$base); $rand2_b = base_encode($rand2,$base); $order_id = $ptime_b.$rand1_b.$rand2_b.Verhoeff::calcsum($time.$rand1.$rand2); echo $order_id; ?> 在我写完这篇文章之后,我想到了另一个可能出错的事情.我记得你不希望你的消费者感到受到侮辱.因此,即使认为诸如’f?ck’或’4ss’之类的坏词最终也可能出现(而且几乎肯定会出现),明确的词语(如在前一词中改变’a’的’4′)绝对不是.因此,我建议您使用以下备用base / upper_limit: <?php $lower_limit = 27000;//=2111 $upper_limit = 809999;//=ZZZZ $base = "123456789BCDFGHJKLMNPQRSTVWXYZ";//erased -a -e -u ?> 请注意,如果您尝试使用更大的数字,您将达到PHP的上限int以及mt_rand限制,这可以通过mt_getrandmax()看到.另外,我想说,因为我看到mt_rand的熵就足够了. 如果您需要更大的随机部分数字,我建议只需将第三部分附加到mt_rand(i,j);其中i和j是你的基数的最小值和最大值,它将增加你的$num-chars长度的订单ID(实际上我做了这个,w /上面的配置). 在数据库方面,它是一个独特的领域,以避免碰撞. 谢谢你们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |