Utils.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. //生成asset_id
  3. function gen_asset_id($appId) {
  4. return gen_id_help($appId, 0);
  5. }
  6. // 生成nonce值
  7. function gen_nonce() {
  8. $randId1 = gen_rand_id();
  9. $randId2 = gen_rand_id();
  10. $content = sprintf("%d#%d#%d", $randId1, $randId2, nanosectime());
  11. $sign = sign_to_int($content);
  12. $nonce = $sign & 0x7fffffffffffffff;
  13. return $nonce;
  14. }
  15. // 生成伪唯一ID
  16. function gen_rand_id() {
  17. $nano = nanosectime();
  18. $randNum1 = mt_rand(0, mt_getrandmax());
  19. $randNum2 = mt_rand(0, mt_getrandmax());
  20. $shift1 = mt_rand(0, 15) + 2;
  21. $shift2 = mt_rand(0, 7) + 1;
  22. $randId = (($randNum1 >> $shift1) + ($randNum2 >> $shift2) + ($nano >> 1)) & 0x7fffffffffffffff;
  23. return $randId;
  24. }
  25. function nanosectime() {
  26. list($msec, $sec) = explode(' ', microtime());
  27. $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
  28. $nanotime = sprintf("%d%06d", $msectime, mt_rand(0, 999999));
  29. return (int)$nanotime;
  30. }
  31. function gen_id_help($baseId, $flag) {
  32. $content = sprintf("%d#%d#%d", $baseId, $flag, nanosectime());
  33. $s = sign_to_int($content);
  34. $r1 = gen_rand_id();
  35. $r2 = gen_rand_id();
  36. $lk = $baseId;
  37. $id = ($lk & 0x0000000000fffff);
  38. $id += (($r2 & 0x000000000000fff0 >> 4) << 20);
  39. if ($flag == 1) {
  40. $id += (0x0000000000000001 << 32);
  41. }
  42. $id += (($r1 & 0x00000000000000ff) << 33);
  43. $id += (($s & 0x000000000000ffff) << 41);
  44. $id += (($r2 & 0x000000000000000f) << 57);
  45. return $id;
  46. }
  47. // 对字符串Hash后转化为整数
  48. function sign_to_int($content) {
  49. $digest = md5($content);
  50. $seg1 = hexdec('0x' . substr($digest, 0, 4));
  51. $seg2 = hexdec('0x' . substr($digest, 4, 4));
  52. $seg3 = hexdec('0x' . substr($digest, 8, 4));
  53. $seg4 = hexdec('0x' . substr($digest, 12, 4));
  54. $sign1 = $seg1 + $seg3;
  55. $sign2 = $seg2 + $seg4;
  56. $sign = ($sign1 & 0x00000000ffffffff) | ($sign2 << 32);
  57. return $sign;
  58. }