3v4l.org

run code in 300+ PHP versions simultaneously
<?php /* Author: Silviu Schiau (@sschiau on Twitter) Web: www.schiau.co File: Particle.php Created: 1364036124000 (UNIX Time) Modified: 1378831167000 (UNIX Time) About: PHP implementation of Twitter Snowflake ID Generator (Extended to 42bits epoch for 96 years 1 month 21 days 16 hours 42 minutes 24 seconds in the future) License: Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt Thanks to Twitter for Snowflake. This header should NOT be removed if you want to use Particle. */ class Particle { const EPOCH=1378831167000; final public function generateParticle($machine_id) { //Time - 42 bits (millisecond precision w/ a custom epoch gives us 96 years 1 month 21 days 16 hours 42 minutes 24 seconds in the future) $time = floor(microtime(true) * 1000); //Substract custom epoch from current time $time -= self::EPOCH; //Add to base $base = pow(2,40); $base += $time; $base = decbin($base); //configured machine id - 10 bits - to 1024 machines $machineid = decbin($machine_id); //sequence number - 12 bits - up to 4096 random numbers per machine $random = mt_rand(0,pow(2,11)-1); $random = decbin($random); //Pack $base = $base.$machineid.$random; return base_convert($base,2,10); } final public function timeFromParticle($particle) { return base_convert(substr(base_convert($particle,10,2),0,41),2,10)-pow(2,41)+self::EPOCH; } } function getId($machine_id = 0, $sleep = true) { // Without sleeping 1ms two elements created at the very // same time will collide when generated on the same machine if ($sleep) { usleep(1000); } $particle = new Particle; return $particle->generateParticle($machine_id); } // We need to verify that there are no ID conflicts echo "Same machine same time\n"; echo getId(1, false) . "\n"; echo getId(1, false) . "\n"; echo getId(1, false) . "\n"; echo getId(1, false) . "\n"; echo getId(1, false) . "\n"; echo getId(1, false) . "\n"; echo "Different machine same time\n"; echo getId(10, false) . "\n"; echo getId(20, false) . "\n"; echo getId(30, false) . "\n"; echo getId(10, false) . "\n"; echo getId(20, false) . "\n"; echo getId(30, false) . "\n"; echo "Same machine different time\n"; echo getId(1) . "\n"; echo getId(1) . "\n"; echo getId(1) . "\n"; echo getId(1) . "\n"; echo getId(1) . "\n"; echo getId(1) . "\n";
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/SsHjI
function name:  (null)
number of ops:  106
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   68     0  E >   ECHO                                                     'Same+machine+same+time%0A'
   69     1        INIT_FCALL                                               'getid'
          2        SEND_VAL                                                 1
          3        SEND_VAL                                                 <false>
          4        DO_FCALL                                      0  $0      
          5        CONCAT                                           ~1      $0, '%0A'
          6        ECHO                                                     ~1
   70     7        INIT_FCALL                                               'getid'
          8        SEND_VAL                                                 1
          9        SEND_VAL                                                 <false>
         10        DO_FCALL                                      0  $2      
         11        CONCAT                                           ~3      $2, '%0A'
         12        ECHO                                                     ~3
   71    13        INIT_FCALL                                               'getid'
         14        SEND_VAL                                                 1
         15        SEND_VAL                                                 <false>
         16        DO_FCALL                                      0  $4      
         17        CONCAT                                           ~5      $4, '%0A'
         18        ECHO                                                     ~5
   72    19        INIT_FCALL                                               'getid'
         20        SEND_VAL                                                 1
         21        SEND_VAL                                                 <false>
         22        DO_FCALL                                      0  $6      
         23        CONCAT                                           ~7      $6, '%0A'
         24        ECHO                                                     ~7
   73    25        INIT_FCALL                                               'getid'
         26        SEND_VAL                                                 1
         27        SEND_VAL                                                 <false>
         28        DO_FCALL                                      0  $8      
         29        CONCAT                                           ~9      $8, '%0A'
         30        ECHO                                                     ~9
   74    31        INIT_FCALL                                               'getid'
         32        SEND_VAL                                                 1
         33        SEND_VAL                                                 <false>
         34        DO_FCALL                                      0  $10     
         35        CONCAT                                           ~11     $10, '%0A'
         36        ECHO                                                     ~11
   76    37        ECHO                                                     'Different+machine+same+time%0A'
   77    38        INIT_FCALL                                               'getid'
         39        SEND_VAL                                                 10
         40        SEND_VAL                                                 <false>
         41        DO_FCALL                                      0  $12     
         42        CONCAT                                           ~13     $12, '%0A'
         43        ECHO                                                     ~13
   78    44        INIT_FCALL                                               'getid'
         45        SEND_VAL                                                 20
         46        SEND_VAL                                                 <false>
         47        DO_FCALL                                      0  $14     
         48        CONCAT                                           ~15     $14, '%0A'
         49        ECHO                                                     ~15
   79    50        INIT_FCALL                                               'getid'
         51        SEND_VAL                                                 30
         52        SEND_VAL                                                 <false>
         53        DO_FCALL                                      0  $16     
         54        CONCAT                                           ~17     $16, '%0A'
         55        ECHO                                                     ~17
   80    56        INIT_FCALL                                               'getid'
         57        SEND_VAL                                                 10
         58        SEND_VAL                                                 <false>
         59        DO_FCALL                                      0  $18     
         60        CONCAT                                           ~19     $18, '%0A'
         61        ECHO                                                     ~19
   81    62        INIT_FCALL                                               'getid'
         63        SEND_VAL                                                 20
         64        SEND_VAL                                                 <false>
         65        DO_FCALL                                      0  $20     
         66        CONCAT                                           ~21     $20, '%0A'
         67        ECHO                                                     ~21
   82    68        INIT_FCALL                                               'getid'
         69        SEND_VAL                                                 30
         70        SEND_VAL                                                 <false>
         71        DO_FCALL                                      0  $22     
         72        CONCAT                                           ~23     $22, '%0A'
         73        ECHO                                                     ~23
   84    74        ECHO                                                     'Same+machine+different+time%0A'
   85    75        INIT_FCALL                                               'getid'
         76        SEND_VAL                                                 1
         77        DO_FCALL                                      0  $24     
         78        CONCAT                                           ~25     $24, '%0A'
         79        ECHO                                                     ~25
   86    80        INIT_FCALL                                               'getid'
         81        SEND_VAL                                                 1
         82        DO_FCALL                                      0  $26     
         83        CONCAT                                           ~27     $26, '%0A'
         84        ECHO                                                     ~27
   87    85        INIT_FCALL                                               'getid'
         86        SEND_VAL                                                 1
         87        DO_FCALL                                      0  $28     
         88        CONCAT                                           ~29     $28, '%0A'
         89        ECHO                                                     ~29
   88    90        INIT_FCALL                                               'getid'
         91        SEND_VAL                                                 1
         92        DO_FCALL                                      0  $30     
         93        CONCAT                                           ~31     $30, '%0A'
         94        ECHO                                                     ~31
   89    95        INIT_FCALL                                               'getid'
         96        SEND_VAL                                                 1
         97        DO_FCALL                                      0  $32     
         98        CONCAT                                           ~33     $32, '%0A'
         99        ECHO                                                     ~33
   90   100        INIT_FCALL                                               'getid'
        101        SEND_VAL                                                 1
        102        DO_FCALL                                      0  $34     
        103        CONCAT                                           ~35     $34, '%0A'
        104        ECHO                                                     ~35
        105      > RETURN                                                   1

Function getid:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 6
Branch analysis from position: 3
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 6
filename:       /in/SsHjI
function name:  getId
number of ops:  14
compiled vars:  !0 = $machine_id, !1 = $sleep, !2 = $particle
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   54     0  E >   RECV_INIT                                        !0      0
          1        RECV_INIT                                        !1      <true>
   57     2      > JMPZ                                                     !1, ->6
   58     3    >   INIT_FCALL                                               'usleep'
          4        SEND_VAL                                                 1000
          5        DO_ICALL                                                 
   61     6    >   NEW                                              $4      'Particle'
          7        DO_FCALL                                      0          
          8        ASSIGN                                                   !2, $4
   63     9        INIT_METHOD_CALL                                         !2, 'generateParticle'
         10        SEND_VAR_EX                                              !0
         11        DO_FCALL                                      0  $7      
         12      > RETURN                                                   $7
   64    13*     > RETURN                                                   null

End of function getid

Class Particle:
Function generateparticle:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/SsHjI
function name:  generateParticle
number of ops:  48
compiled vars:  !0 = $machine_id, !1 = $time, !2 = $base, !3 = $machineid, !4 = $random
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   19     0  E >   RECV                                             !0      
   22     1        INIT_FCALL                                               'floor'
          2        INIT_FCALL                                               'microtime'
          3        SEND_VAL                                                 <true>
          4        DO_ICALL                                         $5      
          5        MUL                                              ~6      $5, 1000
          6        SEND_VAL                                                 ~6
          7        DO_ICALL                                         $7      
          8        ASSIGN                                                   !1, $7
   25     9        ASSIGN_OP                                     2          !1, 1378831167000
   28    10        INIT_FCALL                                               'pow'
         11        SEND_VAL                                                 2
         12        SEND_VAL                                                 40
         13        DO_ICALL                                         $10     
         14        ASSIGN                                                   !2, $10
   29    15        ASSIGN_OP                                     1          !2, !1
   30    16        INIT_FCALL                                               'decbin'
         17        SEND_VAR                                                 !2
         18        DO_ICALL                                         $13     
         19        ASSIGN                                                   !2, $13
   33    20        INIT_FCALL                                               'decbin'
         21        SEND_VAR                                                 !0
         22        DO_ICALL                                         $15     
         23        ASSIGN                                                   !3, $15
   36    24        INIT_FCALL                                               'mt_rand'
         25        SEND_VAL                                                 0
         26        INIT_FCALL                                               'pow'
         27        SEND_VAL                                                 2
         28        SEND_VAL                                                 11
         29        DO_ICALL                                         $17     
         30        SUB                                              ~18     $17, 1
         31        SEND_VAL                                                 ~18
         32        DO_ICALL                                         $19     
         33        ASSIGN                                                   !4, $19
   37    34        INIT_FCALL                                               'decbin'
         35        SEND_VAR                                                 !4
         36        DO_ICALL                                         $21     
         37        ASSIGN                                                   !4, $21
   40    38        CONCAT                                           ~23     !2, !3
         39        CONCAT                                           ~24     ~23, !4
         40        ASSIGN                                                   !2, ~24
   42    41        INIT_FCALL                                               'base_convert'
         42        SEND_VAR                                                 !2
         43        SEND_VAL                                                 2
         44        SEND_VAL                                                 10
         45        DO_ICALL                                         $26     
         46      > RETURN                                                   $26
   43    47*     > RETURN                                                   null

End of function generateparticle

Function timefromparticle:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/SsHjI
function name:  timeFromParticle
number of ops:  24
compiled vars:  !0 = $particle
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   45     0  E >   RECV                                             !0      
   47     1        INIT_FCALL                                               'base_convert'
          2        INIT_FCALL                                               'substr'
          3        INIT_FCALL                                               'base_convert'
          4        SEND_VAR                                                 !0
          5        SEND_VAL                                                 10
          6        SEND_VAL                                                 2
          7        DO_ICALL                                         $1      
          8        SEND_VAR                                                 $1
          9        SEND_VAL                                                 0
         10        SEND_VAL                                                 41
         11        DO_ICALL                                         $2      
         12        SEND_VAR                                                 $2
         13        SEND_VAL                                                 2
         14        SEND_VAL                                                 10
         15        DO_ICALL                                         $3      
         16        INIT_FCALL                                               'pow'
         17        SEND_VAL                                                 2
         18        SEND_VAL                                                 41
         19        DO_ICALL                                         $4      
         20        SUB                                              ~5      $3, $4
         21        ADD                                              ~6      ~5, 1378831167000
         22      > RETURN                                                   ~6
   48    23*     > RETURN                                                   null

End of function timefromparticle

End of class Particle.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
164.23 ms | 1415 KiB | 47 Q