ソースを参照

Add HashidService

Daniel Supernault 5 年 前
コミット
a327f5c167
1 ファイル変更50 行追加0 行削除
  1. 50 0
      app/Services/HashidService.php

+ 50 - 0
app/Services/HashidService.php

@@ -0,0 +1,50 @@
+<?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;
+	}
+
+}