zoukankan      html  css  js  c++  java
  • 生成8位字符串,可用于生成帖子ID的算法

    <?php
    /**
     *  XML 
     */
    class CreateThreadId extends DOMDocument{
        
        private $charcters = array(); /* 解析出来的数组下标 */
        private $values    = array(); /* 解析出来的数组键值 */
        private $result    = "";
          
        /**
         * 构造函数:读取指定的XML文件
         */
        function __construct()
        {
            $this->load( DIR.'config/contrast_table.inc.xml');
            $roots = $this->getElementsByTagName('root');
            
            foreach ($roots as $k) {
                $chars = $k->getElementsByTagName('key');
                $values = $k->getElementsByTagName('value');
                for($i=0; $i<64; $i++ ){
                    $key = $chars->item($i)->nodeValue;
                    $value = $values->item($i)->nodeValue;
                    $this->charcters[$key] = $value;
                    $this->values[$value] = $key;
                }
            }
        }   
        
         /**
          * 生成帖子ID
          * @param int  $server_id 服务器ID
          * @param int  $group_id  组ID
          * @param int  $thread_id 帖子ID
          * @param string 返回生成的帖子ID 
          */
         function createThreadId( $server_id = 1,$group_id = 1,$thread_id = 1){
             /* 先转换成二进制,然后按位补齐 */
             $sid = $this->strpad( decbin(($server_id)),12 );
             $gid = $this->strpad( decbin(($group_id)),16 );
             $tid = $this->strpad( decbin(($thread_id)),16 );
              
             //echo $sid.'0000'.$gid.$tid.'<br/>';
             /* 转换为数组 */
             $aTemp = str_split( $sid.'0000'.$gid.$tid );
             $len   = count($aTemp);
             $res   = array();
             $temp  = 0;
             
             /* 将48位的字符串切成8个子串 */
             for($i=0;$i<$len;$i++){
                 if( ($i)%6 == 0 ){
                     $temp++;
                 }
                 $res[$temp].= $aTemp[$i];    
             } 
             
             $len = count($res);
             /* 清空零时数组 */
             $aTemp = array();
             /* 将8个子串分别转换成进制数 */
             for($i=1;$i<=$len;$i++){
                $aTemp[$i] = bindec($res[$i]);
             }
             /* 对应到64进制表 */
             foreach($aTemp AS $v ){
                $this->result .= $this->values[$v];
             } 
             return $this->result;
         }
         
         /**
          * 获取原始ID信息 反解析
          * @param type $str N6000g1D
          * @return array {"server_id"=>3142,"group_id"=>1,"thread_id"=>103}
          */
         function  getOriginalThreadId($str = ""){
             $aTemp1 = str_split($str);
             $aTemp2 = array();
             
             /* 找到对应64进制表中的值,并转换成二进制,同时按6位补齐 */
             foreach( $aTemp1 as $v ) {
                 $aTemp2[] = $this->strpad( decbin($this->charcters[$v]),6 );
             }
             /* 得到48位的字符串 */
             $x = implode($aTemp2); 
             /* 分别计算 */
             $result['server_id'] = bindec(substr($x, 0,12));
             $result['group_id']  = bindec(substr($x, strlen($x)-32,16));
             $result['thread_id'] = bindec(substr($x, strlen($x)-16));    
             return $result; 
         }
      
         /**
          * 重写补位函数
          * @param type $str 原始二进制串
          * @param type $byte 需要补齐的位数
          * @return string 补齐后的二进制串
          */
         private function strpad($str,$byte){
             if( strlen($str)<$byte ){
                 return str_pad($str, $byte, '0',STR_PAD_LEFT);
             } 
             return $str;
         }
         
         /**
          *
          * @param int $server_id
          * @param int $group_id
          * @return string 生成后的帖子ID 
          */
         function getBlogThreadId($server_id,$group_id){
            $path = DIR.'filecache/thread_id_cache.php';
            require_once ($path);
            $thread_id += 1;
             /* 计算12二进制位用于表示帖子ID 不能超过2^12 */
             if( 65536 <= $thread_id ){
                 $group_id++;
                 $thread_id = 0;
             }     
            $data = "<?php
                \$thread_id = $thread_id;
            ?>
            ";
            /* 将当前new帖子ID写入到缓存文件*/
            $handle = @fopen($path, 'w+');
            if ($handle) {
                fwrite($handle, $data);
                fclose($handle);
            }
            $returnValue = $this->createThreadId($server_id,$group_id,$thread_id);
            return $returnValue;
        }
        
    } 
    ?>
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--
        Document   : contrast_table.inc.xml
        Created on : 2012年8月24日, 上午9:13
        Author     : lsl
        Description:
            生成帖子ID时用的64进制转换关系对照表
            'E','F','G','H','I','J','K','L','M','N',
            'a','b','c','d','e','f','g','h','i','j',
            'O','P','Q','R','S','T','U','V','W','X',
            'k','l','m','n','o','p','q','r','s','t',
            'u','v','w','x','y','z','A','B','C','D',
            '0','1','2','3','4','5','6','7','8','9',
            'Y','Z', '_','$'
    -->
    
    <root>
        <node>
            <value>0</value>
            <key>E</key>
        </node>
        <node>
            <value>1</value>
            <key>F</key>
        </node>
        <node>
            <value>2</value>
            <key>G</key>
        </node>
        <node>
            <value>3</value>
            <key>H</key>
        </node>
        <node>
            <value>4</value>
            <key>I</key>
        </node>
        <node>
            <value>5</value>
            <key>J</key>
        </node>
        <node>
            <value>6</value>
            <key>K</key>
        </node>
        <node>
            <value>7</value>
            <key>L</key>
        </node>
        <node>
            <value>8</value>
            <key>M</key>
        </node>
        <node>
            <value>9</value>
            <key>N</key>
        </node>
        <node>
            <value>10</value>
            <key>a</key>
        </node>
        <node>
            <value>11</value>
            <key>b</key>
        </node>
        <node>
            <value>12</value>
            <key>c</key>
        </node>
        <node>
            <value>13</value>
            <key>d</key>
        </node>
        <node>
            <value>14</value>
            <key>e</key>
        </node>
        <node>
            <value>15</value>
            <key>f</key>
        </node>
        <node>
            <value>16</value>
            <key>g</key>
        </node>
        <node>
            <value>17</value>
            <key>h</key>
        </node>
        <node>
            <value>18</value>
            <key>i</key>
        </node>
        <node>
            <value>19</value>
            <key>j</key>
        </node>
        <node>
            <value>20</value>
            <key>O</key>
        </node>
        <node>
            <value>21</value>
            <key>P</key>
        </node>
        <node>
            <value>22</value>
            <key>Q</key>
        </node>
        <node>
            <value>23</value>
            <key>R</key>
        </node>
        <node>
            <value>24</value>
            <key>S</key>
        </node>
        <node>
            <value>25</value>
            <key>T</key>
        </node>
        <node>
            <value>26</value>
            <key>U</key>
        </node>
        <node>
            <value>27</value>
            <key>V</key>
        </node>
        <node>
            <value>28</value>
            <key>W</key>
        </node>
        <node>
            <value>29</value>
            <key>X</key>
        </node>
        <node>
            <value>30</value>
            <key>k</key>
        </node>
        <node>
            <value>31</value>
            <key>l</key>
        </node>
        <node>
            <value>32</value>
            <key>m</key>
        </node>
        <node>
            <value>33</value>
            <key>n</key>
        </node>
        <node>
            <value>34</value>
            <key>o</key>
        </node>
        <node>
            <value>35</value>
            <key>p</key>
        </node>
        <node>
            <value>36</value>
            <key>q</key>
        </node>
        <node>
            <value>37</value>
            <key>r</key>
        </node>
        <node>
            <value>38</value>
            <key>s</key>
        </node>
        <node>
            <value>39</value>
            <key>t</key>
        </node>
        <node>
            <value>40</value>
            <key>u</key>
        </node>
        <node>
            <value>41</value>
            <key>v</key>
        </node>
        <node>
            <value>42</value>
            <key>w</key>
        </node>
        <node>
            <value>43</value>
            <key>x</key>
        </node>
        <node>
            <value>44</value>
            <key>y</key>
        </node>
        <node>
            <value>45</value>
            <key>z</key>
        </node>
        <node>
            <value>46</value>
            <key>A</key>
        </node>
        <node>
            <value>47</value>
            <key>B</key>
        </node>
        <node>
            <value>48</value>
            <key>C</key>
        </node>
        <node>
            <value>49</value>
            <key>D</key>
        </node>
        <node>
            <value>50</value>
            <key>0</key>
        </node>
        <node>
            <value>51</value>
            <key>1</key>
        </node>
        <node>
            <value>52</value>
            <key>2</key>
        </node>
        <node>
            <value>53</value>
            <key>3</key>
        </node>
        <node>
            <value>54</value>
            <key>4</key>
        </node>
        <node>
            <value>55</value>
            <key>5</key>
        </node>
        <node>
            <value>56</value>
            <key>6</key>
        </node>
        <node>
            <value>57</value>
            <key>7</key>
        </node>
        <node>
            <value>58</value>
            <key>8</key>
        </node>
        <node>
            <value>59</value>
            <key>9</key>
        </node>
        <node>
            <value>60</value>
            <key>Y</key>
        </node>
        <node>
            <value>61</value>
            <key>Z</key>
        </node>
         <node>
            <value>62</value>
            <key>_</key>
        </node>
         <node>
            <value>63</value>
            <key>$</key>
        </node>
    </root>
  • 相关阅读:
    多项式的一些操作
    AtCoder Grand Contest 036E
    THUWC2017 随机二分图
    THUWC2017 在美妙的数学王国中畅游
    SDOI2017 切树游戏
    ZJOI2017 树状数组
    HNOI2015 接水果
    LOJ6503 Magic
    Charles 抓去app接口的使用
    mysql 字符串类型和数字对比的坑
  • 原文地址:https://www.cnblogs.com/lsl8966/p/2917531.html
Copyright © 2011-2022 走看看