ホームページ  >  記事  >  バックエンド開発  >  PHPで固定長の純粋な数値エンコードを生成する方法

PHPで固定長の純粋な数値エンコードを生成する方法

WBOY
WBOYオリジナル
2016-07-25 08:44:491066ブラウズ

この記事の例では、PHP が固定長の純粋なデジタル エンコーディングを生成する方法について説明します。参考のためにみんなで共有してください。詳細は以下の通りです

多くの場合、注文番号、カード番号、ユーザー番号などの固定長の数値コードが必要になります。しかし、多くの場合、私たちが持っているのはデータベースに保存されている順序付きの数値であり、これを固定長の数値コードに直接変換し、それをデータベースに更新して、このレコードの一意の番号を形成することができます。

  1. /**
  2. * 日付または指定されたプレフィックスに基づいて一意の番号を生成します
  3. * ユーザー: minyifei.cn
  4. * 日付: 15/7/7
  5. */
  6. namespace MinyifeiLibs;
  7. class SequenceNumber {
  8. /**
  9. * 表示幅に基づいて指定されたマップビットを取得します
  10. *
  11. * @param integer $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. * 指定されたタイムスタンプをフォーマットします
  50. *
  51. * @param integer $ts タイムスタンプ、null の場合は現在のタイムスタンプを使用します
  52. *
  53. * @return string
  54. */
  55. プライベート静的関数 _fmtTS ($ts=null)
  56. {
  57. $ts = $ts ?: time();
  58. return date(self::$_fmt, $ts);
  59. }
  60. /**
  61. * IDに基づいてランダムで一意のコードを取得します
  62. * @param $id番号
  63. * @param int $prefixプレフィックス
  64. * @param int $width プレフィックスを除く長さ
  65. * @return string
  66. */
  67. public static function generatedNumber ($id,$prefix=10,$width=8)
  68. {
  69. return sprintf("%s%s", $prefix,self::encode($id, $width));
  70. }
  71. /**
  72. * エンコード変換
  73. *
  74. * @param integer $id id
  75. * @param integer $width 数値の追加成分の表示幅
  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. * 固有の番号を取得します
  96. *
  97. * @param integer $id ID、主にデータベースの主キー
  98. * @param integer $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. }
コードをコピー

この記事が皆さんの PHP プログラミング設計に役立つことを願っています。

php


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。