IdCreator.php 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace Qii\Library;
  3. /**
  4. * Library idcreator class
  5. * 可以用于生成订单ID之类的,并带数字校验
  6. * @author Jinhui.zhu <jinhui.zhu@live.cn>
  7. *
  8. * 用法:
  9. * $idcreator = new \Qii\Library\IdCreator();
  10. * 生成Id
  11. * $id = $idcreator->id();
  12. * 校验生成的id
  13. * $result = $idcreate->verify($id);
  14. *
  15. */
  16. class IdCreator
  17. {
  18. const VERSION = '1.2';
  19. public $security = 8888;
  20. public function __construct()
  21. {
  22. }
  23. /**
  24. * 验证订单号是否正确
  25. *
  26. * @param Int $orderId
  27. * @return Bool
  28. */
  29. public function verify($id)
  30. {
  31. $sign = substr($id, -4);
  32. $sid = substr($id, 0, -4);
  33. $randNumber = substr($sid, -8);
  34. $mySign = (string)(substr(hexdec(md5($sid . $this->security)), 0, 5) * 1000);
  35. if ($mySign == $sign) {
  36. return true;
  37. }
  38. return false;
  39. }
  40. /**
  41. * 用 日期小时分钟秒+毫秒+uniqid生成订单ID
  42. *
  43. * @return Int
  44. */
  45. public function id()
  46. {
  47. mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
  48. list($str, $number) = explode(".", uniqid(rand(), true), 2);
  49. $randNumber = substr(sprintf("%08d", $number), 0, 8);
  50. list($minsec, $timestamp) = explode(" ", microtime(), 2);
  51. $sid = date('YmdHis') . sprintf("%06d", substr($minsec, 2, 6)) . $randNumber;
  52. $sign = substr(hexdec(md5($sid . $this->security)), 0, 5) * 1000;
  53. return $sid . $sign;//28位+4位校验码
  54. }
  55. }
  56. ?>