<?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>