使用unix时间戳作为订单ID的缺点是什么?

时间:2015-05-14 23:24:11

标签: php mysql unix timestamp

我正在设计购物项目,并考虑使用unix时间戳作为订单ID。我知道我可以使用mySQL增量数字作为订单ID,如10001,10002等,但我不希望每个人都知道确实有多少订单。

这是一种安全的方法吗?我显然不希望每秒超过1个订单,所以我应该安全,对吧?

function check_number(){

$unique_number = time();
$exists = $this->count_rows('orders', "WHERE order_id='" . $unique_number . "'");

if ($exists >0){
    $results = check_number();
}
else{
    $results = $unique_number;
    return $results;
}
}

3 个答案:

答案 0 :(得分:2)

更强大的解决方案是使用PHP的uniqid()函数。它隐藏了系统中的订单数量,但是如果两个或更多订单恰好在同一秒内出现,它就不会垮掉。

至于实际问题:不,使用unix时间戳作为半随机事件的唯一ID是不安全的,例如用户发出命令。但不太可能,为什么在容易避免碰撞时留下碰撞的可能性呢?

答案 1 :(得分:0)

我不推荐它,因为有可能在同一秒内发出两个订单。使用默认增量并按固定数字添加/减去ID,以便用户看到更大的数字。

$ID = $_GET['ID'];
$ID -= 183727; // subtract offset
// Do mysql stuff
// Build an ID for an URL
$ID += 183727;
echo 'http://../test.php?order=' .$ID;

答案 2 :(得分:0)

  1. 你可以制作一个可以做的crontab var obj = { process: function run(funct, param) { return funct(param); } } obj.process(runSomething, param); 每天或每小时随机移动(不是最好的事情);或者您可以在插入中放置随机ID(超过当前最大ID)。

  2. 如果您想在数据库中保留整数,可以使用带有盐的ALTER TABLE orders AUTO_INCREMENT = max_id + <something>;系列。

  3. 您可以在网址

  4. 中使用uniques slugs
  5. 您可以使用base64_或类似的功能,甚至可以生成随机字符串/数字,但请确保您拥有&#34; UNIQUE&#34;数据库中的约束。

  6. &#34;时间戳&#34;的问题是关于许多并发操作,它在某个时间范围内不会是唯一的;你可以使用微秒并在最后添加一些随机数 - 这可能有所帮助。