生成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>

 

转载于:https://www.cnblogs.com/lsl8966/archive/2013/02/19/2917531.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值