Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here you go:</p> <pre><code>function preciseDivision($x,$y) { // Correct floor's failures by adding a bit of overhead $epsilon = 0.00000001; return floor(($x/$y) + $epsilon); } function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) { static $passcache; if(empty($passcache)) $passcache = array(); $index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $i = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); if (!empty($passKey)) { // Although this function's purpose is to just make the // ID short - and not so much secure, // with this patch by Simon Franz (http://blog.snaky.org/) // you can optionally supply a password to make it harder // to calculate the corresponding numeric ID if(isset($passcache[$passKey])) $index = $passcache[$passKey]; else { if(strlen($passhash = hash('sha256',$passKey)) &lt; strlen($index)) $passhash = hash('sha512',$passKey); $p = str_split($passhash); array_multisort($p, SORT_DESC, $i); $index = implode($i); $passcache = $index; } } $base = strlen($index); if ($to_num) { // Digital number &lt;&lt;-- alphabet letter code $in = strrev($in); $out = 0; $len = strlen($in) - 1; for ($t = 0; $t &lt;= $len; $t++) { $bcpow = bcpow($base, $len - $t); $out += strpos($index, $in[$t]) * $bcpow; } if (is_numeric($pad_up)) { $pad_up--; if ($pad_up &gt; 0) { $out -= pow($base, $pad_up); } } } else { // Digital number --&gt;&gt; alphabet letter code if (is_numeric($pad_up)) { $pad_up--; if ($pad_up &gt; 0) { $in += pow($base, $pad_up); } } $out = ""; for ($t = preciseDivision(log10($in),log10($base)); $t &gt;= 0; $t--) { $bcp = bcpow($base, $t); $a = preciseDivision($in, $bcp); $out .= $index[$a]; $in -= $a * $bcp; } $out = strrev($out); // reverse } return $out; } </code></pre> <p>The problem here was not floor, but floating point precision. The division resulted 2.99999999, and the floor(2.999999) is equal to 2, not 3. This happens because limited size of floating point variables. </p> <p>That's why it did not work. </p> <p>I wrote a function preciseDivision, which automatically adds a very small value to the division, to get through this.</p> <p>And I still believe that there should exist cleaner solutions to this url hashing problem. I'll see what I can do.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload