mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-11-30 10:13:16 +00:00
55 lines
1 KiB
PHP
55 lines
1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Cache;
|
|
|
|
class HashidService {
|
|
|
|
public const MIN_LIMIT = 15;
|
|
public const CMAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|
|
|
public static function encode($id, $minLimit = true)
|
|
{
|
|
if(!is_numeric($id) || $id > PHP_INT_MAX) {
|
|
return null;
|
|
}
|
|
|
|
if($minLimit && 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;
|
|
}
|
|
|
|
}
|