<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-26334994</id><updated>2011-11-28T06:33:44.513+07:00</updated><category term='tth'/><category term='tiger'/><category term='phpclub'/><category term='strongdc'/><category term='php'/><category term='mhash'/><title type='text'>The Truth is Out There</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kupershtokh.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26334994/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kupershtokh.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alexey Kupershtokh</name><uri>http://www.blogger.com/profile/17181011939738976652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26334994.post-8492859153733771648</id><published>2009-05-24T18:48:00.018+07:00</published><updated>2009-06-18T20:37:13.032+07:00</updated><title type='text'></title><content type='html'>Добрый день!

&lt;p&gt;Я хочу рассказать Вам о моем маленьком open-source проекте, который может показаться интересным людям, профилирующим PHP-приложения с помощью Xdebug. Как многим из Вас известно, в результате работы Xdebug'а получаются логи в формате cachegrind. Их, в свою очередь, можно анализировать с помощью старого доброго KCachegrind, можно разбирать посредством Webgrind, CachegrindVisualizer, и т.д. Но я решил пойти другим путем, и вот что у меня получилось...&lt;/p&gt;

&lt;p&gt;Итак, встречаем &lt;a href="http://code.google.com/p/xdebugtoolkit/"&gt;xdebugtoolkit&lt;/a&gt;! Это набор простых утилиток, основная из которых - cg2dot -  умеет преобразовывать файлы Xdebug'а в вид &lt;span style="font-weight: bold;"&gt;понятных&lt;/span&gt; раскрашенных деревьев вызовов в формате &lt;a href="http://www.graphviz.org/"&gt;dot&lt;/a&gt;, для просмотра которых рекомендую другую утилитку - &lt;a href="http://code.google.com/p/jrfonseca/wiki/XDot"&gt;xdot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Одной из своих находок, еще со времен работы над cachegrindvisualizer, я считаю то, что мне удалось сделать максимально компактные графы вызовов, не выходя за рамки древовидности. Это проще всего показать сразу на примере. &lt;a href="http://code.google.com/p/xdebugtoolkit/source/browse/trunk/xdebugtoolkit/fixtures/2.php?r=92"&gt;Такой код&lt;/a&gt;, несмотря на множественные переиспользования функций, после агрегации выглядит таким образом:&lt;/p&gt;&lt;p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://xdebugtoolkit.googlecode.com/svn/wiki/aggregate_demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 656px; height: 471px;" src="http://xdebugtoolkit.googlecode.com/svn/wiki/aggregate_demo.png" alt="" border="0" /&gt;&lt;/a&gt;

&lt;/p&gt;&lt;p&gt;Как видно, агрегируются только вызовы с одинаковыми путями. Например, вызовы функции d с путями
&lt;/p&gt;&lt;pre&gt;root -&gt; {main} -&gt; a -&gt; c -&gt; d&lt;/pre&gt;
агрегируются между собой, но не с вызовами по путям
&lt;pre&gt;root -&gt; {main} -&gt; b -&gt; c -&gt; d&lt;/pre&gt;
Для сравнения, &lt;a href="http://pycallgraph.slowchop.com/pycallgraph/wiki/RegExpExample"&gt;вот что бывает&lt;/a&gt;, когда граф перестает быть деревом.&lt;/p&gt;

&lt;p&gt;Цвет каждой ноды состоит из двух компонент:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(204, 204, 0);"&gt;Желтый&lt;/span&gt; цвет - кол-во вызовов. Чисто жёлтым вызовом будет тот, который вызывали максимальное кол-во раз, но который при этом очень быстро отработал.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(204, 0, 204);"&gt;Сиреневый&lt;/span&gt; - собственное (без подвызовов) затраченное время. Чисто сиреневым будет единичный вызов с максмальным собственным временем.&lt;/p&gt;
&lt;p&gt;Складывая желтый и сиреневый, получаем &lt;span style="color: rgb(204, 0, 0);"&gt;красный&lt;/span&gt; - такое бывает в случае большого кол-ва вызовов одной и той же функции, которые в сумме имеют очень большой self time.&lt;/p&gt;

&lt;p&gt;Планы по дальнейшей разработке можно посмотреть в &lt;a href="http://code.google.com/p/xdebugtoolkit/issues/list"&gt;issues на google code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PS: тому, что xdebugtoolkit написан на питоне, есть одно простое объяснение: проект начинался как реальная задача, на которой я хотел узнать питон получше. Производительность меня интересовала всегда, поэтому я решил совместить приятное с полезным.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26334994-8492859153733771648?l=kupershtokh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kupershtokh.blogspot.com/feeds/8492859153733771648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26334994&amp;postID=8492859153733771648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26334994/posts/default/8492859153733771648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26334994/posts/default/8492859153733771648'/><link rel='alternate' type='text/html' href='http://kupershtokh.blogspot.com/2009/05/open-source-php-xdebug.html' title=''/><author><name>Alexey Kupershtokh</name><uri>http://www.blogger.com/profile/17181011939738976652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26334994.post-3106115043506565841</id><published>2007-12-27T17:23:00.000+06:00</published><updated>2007-12-27T18:40:30.926+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tiger'/><category scheme='http://www.blogger.com/atom/ns#' term='mhash'/><category scheme='http://www.blogger.com/atom/ns#' term='phpclub'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='tth'/><category scheme='http://www.blogger.com/atom/ns#' term='strongdc'/><title type='text'></title><content type='html'>There were a &lt;a href="http://phpclub.ru/talk/showthread.php?s=&amp;threadid=105062"&gt;conversation&lt;/a&gt; (in Russian) about how to generate files' &lt;a href="http://en.wikipedia.org/wiki/Hash_tree#Tiger_tree_hash"&gt;TTH&lt;/a&gt; hashes compatible with &lt;a href="http://en.wikipedia.org/wiki/Direct_Connect_%28file_sharing%29"&gt;DC&lt;/a&gt;. I couldn't find any ready-to-use solution in the Internet done in PHP. And taking into account some reefs in the implementation, I decided to make the class I'd written public.

PS: use it at your own risk :)

&lt;pre&gt;
&lt;span style="color: #0000BB"&gt;&amp;lt;?php

&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;Alexey&amp;nbsp;Kupershtokh&amp;nbsp;&amp;lt;alexey.kupershtokh@gmail.com&amp;gt;
&amp;nbsp;*&amp;nbsp;@url&amp;nbsp;http://kupershtokh.blogspot.com/2007/12/on-phpclub.html
&amp;nbsp;*/
&lt;/span&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;TTH&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{
&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$BASE32_ALPHABET&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_hash&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;null&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_mhash&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;null&lt;/span&gt;&lt;span style="color: #007700"&gt;;

&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Generates&amp;nbsp;DC-compatible&amp;nbsp;TTH&amp;nbsp;of&amp;nbsp;a&amp;nbsp;file.
&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$filename
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;public&amp;nbsp;static&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getTTH&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$filename&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$filename&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"rb"&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(!&lt;/span&gt;&lt;span style="color: #0000BB"&gt;feof&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buf&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fread&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1024&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buf&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;||&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tiger&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\0"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buf&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;%&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tiger&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\1"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;].&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unset(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;round&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$k&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$k&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$k&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;round&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$k&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$k&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;%&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isset(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tiger&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\1"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;].&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;elseif(isset(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;]))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unset(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;round&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$j&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;base32encode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$hashes&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;-&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Generates&amp;nbsp;a&amp;nbsp;DC-compatible&amp;nbsp;tiger&amp;nbsp;hash&amp;nbsp;(not&amp;nbsp;TTH).
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Automatically&amp;nbsp;chooses&amp;nbsp;between&amp;nbsp;hash()&amp;nbsp;and&amp;nbsp;mhash().
&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$string
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;private&amp;nbsp;static&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tiger&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;is_null&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_hash&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_hash&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;function_exists&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"hash_algos"&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;in_array&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"tiger192,3"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;hash_algos&lt;/span&gt;&lt;span style="color: #007700"&gt;());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_hash&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tigerfix&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;hash&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"tiger192,3"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;is_null&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_mhash&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_mhash&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;function_exists&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"mhash"&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$tiger_mhash&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tigerfix&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;mhash&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;MHASH_TIGER&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;trigger_error&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;E_USER_ERROR&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Neither&amp;nbsp;tiger&amp;nbsp;hash&amp;nbsp;function&amp;nbsp;is&amp;nbsp;available."&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Repairs&amp;nbsp;tiger&amp;nbsp;hash&amp;nbsp;for&amp;nbsp;compatibility&amp;nbsp;with&amp;nbsp;DC.
&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@url&amp;nbsp;http://www.php.net/manual/en/ref.mhash.php#55737
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$binary_hash
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&amp;nbsp;
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;private&amp;nbsp;static&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;tigerfix&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$binary_hash&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_split&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_split&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$binary_hash&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;8&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_tiger&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;""&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_split&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$key&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_split&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$key&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strrev&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_tiger&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_split&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$key&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$my_tiger&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Just&amp;nbsp;a&amp;nbsp;base32encode&amp;nbsp;function&amp;nbsp;:)
&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@url&amp;nbsp;http://www.php.net/manual/en/function.sha1-file.php#61741
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$input
&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;private&amp;nbsp;static&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;base32encode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$input&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;''&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$position&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strlen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$input&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&amp;lt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;8&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ord&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$input&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$index&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;8&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$index&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//take&amp;nbsp;as&amp;nbsp;much&amp;nbsp;data&amp;nbsp;as&amp;nbsp;possible&amp;nbsp;out&amp;nbsp;of&amp;nbsp;storedData
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;while&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;5&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;5&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$BASE32_ALPHABET&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;amp;=&amp;nbsp;((&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//while
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//deal&amp;nbsp;with&amp;nbsp;leftover&amp;nbsp;data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&amp;lt;=&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;5&lt;/span&gt;&lt;span style="color: #007700"&gt;-&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedBitCount&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;self&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$BASE32_ALPHABET&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$storedData&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;}
}

&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26334994-3106115043506565841?l=kupershtokh.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kupershtokh.blogspot.com/feeds/3106115043506565841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26334994&amp;postID=3106115043506565841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26334994/posts/default/3106115043506565841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26334994/posts/default/3106115043506565841'/><link rel='alternate' type='text/html' href='http://kupershtokh.blogspot.com/2007/12/on-phpclub.html' title=''/><author><name>Alexey Kupershtokh</name><uri>http://www.blogger.com/profile/17181011939738976652</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
