Home >Backend Development >PHP Tutorial >How to generate fixed-length pure numeric encoding in php

How to generate fixed-length pure numeric encoding in php

WBOY
WBOYOriginal
2016-07-25 08:44:491090browse

The example in this article describes how PHP generates fixed-length pure digital encoding. Share it with everyone for your reference. The details are as follows:

Many times we need some fixed-length numeric codes, such as order number, card number, user number, etc.! But often what we have is an ordered number stored in the database, which we can directly convert into a fixed-length numeric code, and then update it to the database to form a unique number for this record.

  1. /**
  2. * Generate a unique number based on date or given prefix
  3. * User: minyifei.cn
  4. * Date: 15/7/7
  5. */
  6. namespace MinyifeiLibs;
  7. class SequenceNumber {
  8. /**
  9. * Get the specified mapbit based on the display width
  10. *
  11. * @param integer $width number display width
  12. *
  13. * @return array
  14. */
  15. private static function _getMapbit($width)
  16. {
  17. $mapBits = array(
  18. 4=>array(
  19. 10, 2, 11, 3, 0, 1, 9, 7, 12, 6, 4, 8, 5,
  20. ),
  21. 5=>array(
  22. 4, 3 , 13, 15, 7, 8, 6, 2, 1, 10, 5, 12, 0, 11, 14, 9,
  23. ),
  24. 6=>array(
  25. 2, 7, 10, 9, 16, 3, 6, 8, 0, 4, 1, 12, 11, 13, 18, 5, 15, 17, 14,
  26. ),
  27. 7=>array(
  28. 18, 0, 2, 22, 8, 3 , 1, 14, 17, 12, 4, 19, 11, 9, 13, 5, 6, 15, 10, 16, 20, 7, 21,
  29. ),
  30. 8=>array(
  31. 11, 8, 4, 0, 16, 14, 22, 7, 3, 5, 13, 18, 24, 25, 23, 10, 1, 12, 6, 21, 17, 2, 15, 9, 19, 20,
  32. ) ,
  33. 9=>array(
  34. 24, 23, 27, 3, 9, 16, 25, 13, 28, 12, 0, 4, 10, 18, 11, 2, 17, 1, 21, 26, 5 , 15, 7, 20, 22, 14, 19, 6, 8,
  35. ),
  36. 10=>array(
  37. 32, 3, 1, 28, 21, 18, 30, 7, 12, 22, 20, 13, 16, 15, 6, 17, 9, 25, 11, 8, 4, 27, 14, 31, 5, 23, 24, 29, 0, 10, 19, 26, 2,
  38. ),
  39. 11= >array(
  40. 9, 13, 2, 29, 11, 32, 14, 33, 24, 8, 27, 4, 22, 20, 5, 0, 21, 25, 17, 28, 34, 6, 23 , 26, 30, 3, 7, 19, 16, 15, 12, 31, 1, 35, 10, 18,
  41. ),
  42. 12=>array(
  43. 31, 4, 16, 33, 35, 29, 17, 37, 12, 28, 32, 22, 7, 10, 14, 26, 0, 9, 8, 3, 20, 2, 13, 5, 36, 27, 23, 15, 19, 34, 38, 11, 24, 25, 30, 21, 18, 6, 1,
  44. ),
  45. );
  46. return $mapBits[intval($width)];
  47. }
  48. /**
  49. * Format the given timestamp
  50. *
  51. * @param integer $ts timestamp, if null use current timestamp
  52. *
  53. * @return string
  54. */
  55. private static function _fmtTS ($ts=null)
  56. {
  57. $ts = $ts ?: time();
  58. return date(self::$_fmt, $ts);
  59. }
  60. /**
  61. * Get a random unique code based on id
  62. * @param $id number
  63. * @param int $prefix prefix
  64. * @param int $width length except prefix
  65. * @return string
  66. */
  67. public static function generateNumber ($id,$prefix=10,$width=8)
  68. {
  69. return sprintf("%s%s", $prefix,self::encode($id, $width));
  70. }
  71. /**
  72. * Encoding conversion
  73. *
  74. * @param integer $id id
  75. * @param integer $width The display width of the additional component of the number
  76. *
  77. * @return integer
  78. */
  79. public static function encode($id, $width)
  80. {
  81. $maximum = intval(str_repeat(9, $width));
  82. $superscript = intval(log($maximum) / log(2)) ;
  83. $r = 0;
  84. $sign = 0x1 << $superscript;
  85. $id |= $sign;
  86. $mapbit = self::_getMapbit($width);
  87. for ($x = 0; $x < $superscript; $x++) {
  88. $v = ($id >> $x) & 0x1;
  89. $r |= ($v << $mapbit[$x]);
  90. }
  91. $ r += $maximum - pow(2, $superscript) + 1;
  92. return sprintf("%0${width}s", $r);
  93. }
  94. /**
  95. * Get the unique number
  96. *
  97. * @param integer $id id, mostly database primary key
  98. * @param integer $width Number display width
  99. * @param integer $ts timestamp
  100. *
  101. * @return string
  102. */
  103. public static function get ($id, $width, $ts=null)
  104. {
  105. return sprintf('%s%s', self::_fmtTS($ts), self::encode($id, $width));
  106. }
  107. }
Copy code

I hope this article will be helpful to everyone’s PHP programming design.

php


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn