mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-12-22 21:13:16 +00:00
50 lines
994 B
PHP
50 lines
994 B
PHP
|
<?php
|
||
|
|
||
|
namespace App\Services;
|
||
|
|
||
|
use Cache;
|
||
|
|
||
|
class HashidService {
|
||
|
|
||
|
public const MIN_LIMIT = 15;
|
||
|
public const CMAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
||
|
|
||
|
public static function encode($id)
|
||
|
{
|
||
|
if(!is_numeric($id) || $id > PHP_INT_MAX || strlen($id) < self::MIN_LIMIT) {
|
||
|
return null;
|
||
|
}
|
||
|
$key = "hashids:{$id}";
|
||
|
return Cache::remember($key, now()->hours(48), function() use($id) {
|
||
|
$cmap = self::CMAP;
|
||
|
$base = strlen($cmap);
|
||
|
$shortcode = '';
|
||
|
while($id) {
|
||
|
$id = ($id - ($r = $id % $base)) / $base;
|
||
|
$shortcode = $cmap{$r} . $shortcode;
|
||
|
};
|
||
|
return $shortcode;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public static function decode($short)
|
||
|
{
|
||
|
$len = strlen($short);
|
||
|
if($len < 3 || $len > 11) {
|
||
|
return null;
|
||
|
}
|
||
|
$id = 0;
|
||
|
foreach(str_split($short) as $needle) {
|
||
|
$pos = strpos(self::CMAP, $needle);
|
||
|
// if(!$pos) {
|
||
|
// return null;
|
||
|
// }
|
||
|
$id = ($id*64) + $pos;
|
||
|
}
|
||
|
if(strlen($id) < self::MIN_LIMIT) {
|
||
|
return null;
|
||
|
}
|
||
|
return $id;
|
||
|
}
|
||
|
|
||
|
}
|