Base10 到 Base64 网址缩短

2023-11-24

我正在为一个正在学习 php 的项目编写一个 url 缩短函数,这是代码(顺便说一句,我想global这不是一件好事:P):

$alphabet = array(1 => "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",
                "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","_","-");

function shorten($id){
    global $alphabet;
    $shortenedId = "";
    while($id>0){
        $remainder = $id % 64;
        $id = $id / 64;     
        $shortenedId = $alphabet[$remainder].$shortenedId;
    }
    return $shortenedId;
}

代码取自这篇维基百科文章并适配php。我的问题是,当我将 64 的倍数传递给函数时,我得到错误的(出于我的目的)结果,例如 128 返回 b,这是不正确的,它应该是 aaa,但这对于 3 位数字来说太长了数字。

另外,如果我将 1'000'000'000'000 传递为$id我得到 nItOq...我觉得这是错误的,因为像 bit.ly 这样的 url 缩短服务如果我使用它会返回一个 6 数字 id,而且我不认为这个算法比他们的更好。

那么,两个问题:

  • 你发现上面的代码有什么错误吗?
  • 如何管理64位多个ID?我是否必须忽略它们并转到下一个?

只需要一些小调整,主要的两个是使字母表零索引而不是一索引,并在除法之前从 id 中减去余数

function shorten($id)
{
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
    $shortenedId = '';
    while($id>0) {
        $remainder = $id % 64;
        $id = ($id-$remainder) / 64;     
        $shortenedId = $alphabet{$remainder} . $shortenedId;
    };
    return $shortenedId;
}

这是一个进一步修改的版本...我只是喜欢

function shorten($id, $alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-')
{
    $base = strlen($alphabet);
    $short = '';
    while($id) {
        $id = ($id-($r=$id%$base))/$base;     
        $short = $alphabet{$r} . $short;
    };
    return $short;
}

EDIT:排序串联与 OP 相同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Base10 到 Base64 网址缩短 的相关文章

  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 如何让 Laravel“确认”验证器将错误添加到确认字段?

    默认情况下 Laravel 确认 验证器将错误消息添加到原始字段 而不是通常包含确认值的字段 password gt required confirmed min 8 是否有任何简单的方法来扩展验证器或使用一些技巧来强制它始终在确认字段而不
  • PHP 函数 iconv 字符编码从 iso-8859-1 到 utf-8

    我正在尝试将字符串从 iso 8859 1 转换为 utf 8 但是当我找到这两个字符 和 时 函数返回 一个字符 是一个里面有两个数字的正方形 我该如何解决这个问题 我认为您正在寻找的编码是Windows 代码页 1252 http en
  • 如何将JS/CSS文件包含到Slim框架的模板中?

    我正在使用 Slim 框架开发一个简单的网络应用程序 我遇到了一个可能很简单的问题 我想将静态文件 CSS 和 Javascript 包含到我的模板中 我的项目文件夹结构如下 index php lt where all the routi
  • Laravel 5 配置语言环境,不起作用

    已完成的修改 on 配置 应用程序 php locale gt env APP LOCALE en fallback locale gt en on env APP LOCALE pt 我也复制了 资源 lang en文件到 资源 lang
  • 使用 CodeIgniter 加载视图文件夹外的视图

    我需要从以下范围之外加载视图 this gt load gt view 这似乎是从base application views目录 如何从外部访问视图 application 目录 我想我将不得不延长CI Loader class这是最好的
  • WooCommerce 自定义字段 - 多选

    我在 WooCommerce 的结账页面添加额外的字段 我可以添加文本框等基本字段 但需要添加一个 多 选择框 用户可以在其中选择多个项目 我已经弄清楚如何通过代码添加选择框 如下所示 add action woocommerce afte
  • 使用 PHP 创建、编辑和删除 crontab 作业?

    是否可以使用 PHP 创建 编辑和删除 crontab 作业 我知道如何列出 Apache 用户当前的 crontab 作业 output shell exec crontab l echo output 但是如何使用 PHP 添加 cro
  • 如何接收发送到 twilio 号码的短信

    我在 twilio 创建了一个免费帐户 用于通过我的网站发送短信 注册后 我得到了一个 twilio 号码 例如 XXX XXX XXXX 我可以向手机号码发送消息 但我不知道如何使用这个 twilio 号码接收短信 请帮我解决这个问题 T
  • 传递给 Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() 的参数 1 必须是以下实例

    我创建了一个新的中间件来检查用户令牌我创建了中间件然后添加到 kernal php 但是当我尝试访问中间件中的 request 时我收到错误 这是我的中间件代码 namespace App Http Middleware use Illum
  • PHP正则表达式替换链接url

    我需要添加href 之前http 如果这http 不遵循href or src 以下代码部分有效 部分意味着它考虑 a href 只但不src a s i a href target blank gt 0 a str 预先感谢各位的回复 s
  • FPM 与 apache2 无法工作(权限被拒绝)

    我正在尝试使用 apache fastcgi 和 fpm 设置一个 Debian Web 服务器 但我越来越恼火 一旦我停用 mod php 我就会收到以下错误 2014 年 5 月 22 日星期四 12 16 10 错误 客户端 xxx
  • 将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebElement?

    我正在使用 Selenium WebDriver 我想执行 jQuery 代码来查找一些元素 我的代码如下 public function uploadGrantDoc script return itemlist grant file u
  • 从 PHP 启动守护进程

    对于网站 我需要能够启动和停止守护进程 我目前正在做的是 exec sudo etc init d daemonToStart start 守护进程已启动 但 Apache PHP 挂起 做一个ps aux透露sudo它本身变成了僵尸进程
  • zend框架验证模型中的数据而不是表单中的数据

    使用 Zend Framework 2 在我的应用程序中 要编辑数据库中的数据 可以编译 html 表单或发送 http post 请求 我的服务器作为 Web 服务实现 在第二种情况下 不会呈现表单 问题 如果当服务器收到不是从表单发送而
  • Symfony2 - 在自定义验证器中调用 EmailValidator

    我正在创建一个自定义验证器约束来验证 联系人 类似于 John Doe 电子邮件受保护 gt 遵循Cookbook http symfony com doc current cookbook validation custom constr
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • Laravel 5 Eloquent 在多个级别上将关系附加到 JSON

    因此 在模型中包含关系非常容易 例如 class User extends Model protected with roles class Role extends Model protected with permissions 当有对
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1

随机推荐

  • 联合类型的部分键作为打字稿中对象的键

    我想使用联合类型的键作为打字稿中对象的键 type EnumType a1 a2 const object key in EnumType string a1 test 在这种情况下 我什至必须添加 a2 作为对象中的键 有没有办法让它成为
  • 使用 Spring mvc 创建第一个 Hello world 应用程序时出错

    首先 我想为可能重复的主题道歉 但我找不到问题的答案 我今天开始使用 spring mvc 我的 hello world 应用程序有一些问题 任何人都可以帮助我使这个程序运行吗 因为我遵循了一些说明 但我不知道如何解决这个问题 This是我
  • 32 位进程可以在 64 位 Windows 操作系统上访问更多内存吗?

    据我了解 在没有 3GB 开关的 32 位 Windows 上 32 位进程只能访问 2 GB 内存 并且其中一些内存由于其自身的邪恶原因而被操作系统占用 这似乎与我的经验相符 因为我们有一个应用程序 当它达到 1 2 1 5 GB 左右的
  • 检查 [] 运算符

    Python中如何检查对象是否支持 操作 我想到了类似以下的事情 if supports obj print Supports 您不 检查支持 你只需使用它 try a obj whatever except TypeError whate
  • JAX-RS 接受图像作为输入

    相当长一段时间以来 我一直在开发 JAX RS Web 服务来满足我的开发需求 到目前为止我编写的所有方法都接受 java 字符串或原始类型作为输入 这种方法的一个例子 POST Path MyMethod Produces MediaTy
  • C++项目中ffmpeg的CMake配置

    我已经使用 Homebrew 安装了 ffmpeg 版本 4 并且尝试在 C 项目中使用各种 ffmpeg 库 但在链接过程中遇到多个错误 Undefined symbols for architecture x86 64 av free
  • 浏览器选项卡和窗口之间的区别

    在 Web 浏览器中 每个窗口都有自己的 JavaScript 环境 以及自己的 JavaScript 环境 全局对象 但看起来在同一窗口中打开一个新选项卡也会创建一个不同的全局对象 这是真的吗 新选项卡和新窗口之间的主要区别是什么 唯一的
  • IntelliJ IDEA 不会加载在我的磁盘上找到的 Groovy

    您好 我最近想开始在 Groovy 中进行开发 但是当我尝试 IntelliJ IDEA 时 它不会加载 Groovy 因为它显示 看起来指定路径中的 Groovy 分发已损坏 不能 确定版本 发生了什么事我什至尝试了一些旧版本 但它也不起
  • 使用 Mono.Cecil 发出对 System.Lazy 构造函数的调用

    我正在尝试发出一种实例化 System Lazy 的方法 但失败并出现 无效令牌 的 PEVerify 错误 位于该行newobj instance void class mscorlib System Lazy 1
  • Next.JS 代码为何同时在服务器和客户端上运行?

    在 Next JS 应用程序中 您会看到组件的代码在服务器和客户端上运行 因此 如果您有以下代码 const Title gt console log gt Hello return h1 Some title h1 然后您在开发环境中运行
  • 将 ObservableCollection 绑定到 DataGridView

    我正在将可观察集合 FoodList 绑定到 WinForm 中的 BindingSource 此 BindingSource 由表单上的数据网格使用 我假设当我向集合中添加一个新项目时 它会引发一个事件 并且一个新行会出现在我的网格中 但
  • 如何使用RVM管理多个gemset和ruby版本?

    我对 RVM 网站上给出的解释感到非常困惑 我不清楚不同的红宝石解释器和宝石集之间的关系 按照我的说法 是这样的 我的 Mac 帐户有一个 rvm 该 nvm 安装并管理一组不同版本的 ruby 解释器 每个红宝石版本都有一组宝石 我把事情
  • 从 mongoengine 中的文档获取必填字段?

    我希望能够获取我创建的文档所需的列表或某种字段集 例如 这是我的文档 nickName StringField required True password StringField required True firstName Strin
  • 设置 Fcm 通知优先级 - Azure 通知中心

    我正在尝试在 C SDK 中的 Fcm 通知有效负载上设置高优先级 以便从后端将其发送到移动应用程序 根据 Fcm 文档 Json Paylod 应该如下所示 message topic subscriber updates notific
  • 即使通过 PuTTY 连接到 Windows 上的 GitHub 时也出现问题

    我知道已经在各个地方 Stack Overflow 内外 讨论了这个问题 但我还没有找到一致有效的解决方案 现在 我正在尝试通过 putty 连接到 github 我正在连接到 github com 加载我的私钥 并获得 登录为 迅速的 当
  • CSS 目标只是类名以字符串开头和结尾

    我想为我们公司创建某些标准的 css 代码 作为品牌 我想以我的公司名称开始所有类名 并以 Cls 结尾 div class Nam StdCss Cls div div class Nam StdCss Raduis Cls div di
  • 如何最小化asp.net中页面的视图状态大小?

    如何最小化asp net中页面的视图状态大小 请帮忙 您有多种选择来减少 ViewState 禁用视图状态对于不需要它的控件 这是最有效的解决方案 例如 如果您可以在服务器上缓存一些数据 那么您可以为每个请求重新绑定任何数据绑定控件 并且不
  • Flutter中main函数和runApp()函数有什么区别?

    我倾向于问这个问题 因为大多数时候我们直接调用 runApp 函数 main 而不执行其他操作 我的问题是为什么 runApp 和 main 保持不同 可能很简单 保留 main 函数或 runApp 函数 而放弃其他函数 在 Dart 中
  • 正则表达式:如果字母与数字相邻,则添加空格

    我正在使用 PHP 但不太擅长使用正则表达式 我需要一个 preg replace 如果字母或数字相邻 它可以添加空格 这些是场景 mystreet12 gt mystreet 12 mystreet 38B gt mystreet 38
  • Base10 到 Base64 网址缩短

    我正在为一个正在学习 php 的项目编写一个 url 缩短函数 这是代码 顺便说一句 我想global这不是一件好事 P alphabet array 1 gt a b c d e f g h i j k l m n o p q r s t