替代 MySQL 的 UUID 版本 1 功能?

2023-11-22

Context

Web 应用程序、PHP 5、MySQL 5.0.91

问题

我最近从使用自动递增整数改为使用 UUID 作为某些表的主键。通过 MySQL 生成 UUID 时UUID()功能,它们彼此非常相似:

| uuid                                 |
----------------------------------------
| 1e5988da-afec-11e1-9877-5464f7aa6d24 |
| 408092aa-afad-11e1-9877-5464f7aa6d24 |
  ^------^   ^^
  1      8   11-12

可以看到,只有前8个字符以及第11个和第12个字符不同。据我了解,UUID 版本 1 使用时间戳和硬件 MAC 地址来生成 UUID。然而,由于这些相似之处(以及在我的情况下 MAC 地址永远不会改变的事实),我对使用版本 1 犹豫不决。此外,如果 MAC 地址永远不会改变,则大部分 UUID 都是无用的并且浪费空间。

我的自定义 UUID 函数

作为实验,我用 PHP 编写了一个自定义 UUID 生成器:

public static function GenerateUUID()
{
    return
    substr(sha1(Account::GetUsername() . Account::GetUserID()), 18, 8) . "-" .
    substr(md5(time()), rand() % 28, 4) . "-" . 
    substr(md5(date("Y")), rand() % 28, 4) . "-" . 
    substr(sha1(rand()), 20, 4) . "-" . 
    substr(sha1(rand() % PHP_INT_MAX), 17, 12);
}

结果示例:

| uuid                                 |
----------------------------------------
| 574d18c2-5080-bac9-5597-45435f363ea1 |
| 574d18c2-30d4-8b5b-4ffd-001744d3d287 |

此处,对于同一用户,前 8 个字符是相同的。这是有意的,但不是必需的。

问题

是否有首选/推荐的方法来生成版本 4 或版本 5 UUID在 MySQL 查询中?

如果不是,是否可以在 PHP 中生成不符合规范的自定义 UUID(如上所述)?

限制

  • 我正在使用具有命令行访问权限的共享托管计划,但无法修改现有的 MySQL 安装。
  • 我宁愿避免第三方包/库。

Notes

  • 我现在不会也不会执行合并、同步或其他需要包含 MAC 地址的 GUID 的操作。这不是这里的问题。

您担心“大部分 UUID 无用且浪费空间”是数据类型大小所固有的。 您的数据库中永远无法拥有 16 字节理论限制所允许的那么多条目。

事实上,如果您仅将 UUID 用作表 ID,则 V1 UUID 比 V4 更合适 - 因为它使用 MAC 地址和时间戳来防止冲突。在 V4 中没有这样的机制,尽管实际上你也不需要太担心冲突:) 如果您需要 UUID 不可预测,则应使用 V4 UUID 而不是 V1。

另请注意,组合 4x4 字节随机值可能与创建 16 字节随机值不同。 与加密和随机性一样:我不建议实现您自己的 UUID::V4 例程。

如果安装在您的计算机上,您可以使用php-uuid包裹。

An example code (which can be used in your application as is) can be found here: http://rommelsantor.com/clog/2012/02/23/generate-uuid-in-php/

像这样使用它:

$uuid = uuid_create(1);

能够在其网络服务器上安装软件包的用户可以安装所需的软件包,例如:(此处适用于 ubuntu)

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

替代 MySQL 的 UUID 版本 1 功能? 的相关文章

  • 使用 JOIN 和 UNION 合并不同表中的记录

    我需要创建一个查询来组合两个表中的数据 我认为可能是 JOIN 和 UNION 的组合 在此示例中 我需要列出状态处于活动状态的所有姓名 仅一次 并将他们的葡萄酒 苏打水 晚餐 甜点和水果偏好组合起来 按姓名排序 我不确定单独的 JOIN
  • 如何在Web服务中传递URL

    我想将此 URL 作为网址中的值传递http localhost h2orn php verify php email emails hash hash但是 我只能在 符号之前传递 我想传递所有 URL 我正在使用java网络服务 代码在这
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php
  • xdebug_start_trace 行为异常

    我正在尝试进一步减少脚本内存使用量 我试图让我的脚本使用 xdebug 生成输出来分析内存使用情况 这是一个基于 CLI 的脚本 有 shebang usr local bin php q 我向它传递一个参数并检查它 argc gt 1 i
  • 从 .frm 文件恢复 mysql 数据库

    我每周都会倾倒所有桌子以获得备份 但后来我明白它只是存储表的 frm文件 它不显示表的 MYD 和 MYI 文件 所以我只有我的数据库的 frm 文件 而且我的数据库是innodb 那么我可以用数据库中的数据获取我的数据库吗 是的 这是可能
  • 适用于 Windows 的 PHP 支持的 GUI 应用程序

    我知道 PHP 是一种解释性语言 对于基于 Web 的事物来说 不是为在实际操作系统上运行 GUI 应用程序而设计的 但是有没有办法呢 基本上 是否有一个框架 系统允许我创建 本机 基本上是二进制文件 exe 看起来像带有本机控件和所有内容
  • jQuery和PHP中如何知道返回数据是Json还是String?

    我想在客户端 jQuery 检查 PHP 函数返回的数据是否是 Json 对象或 String 来分配不同的函数 如果 json 的格式不正确 jQuery 的 parseJson 将生成异常 您可以将调用包装在 try catch 块中
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • 使用 PDO 在 SQLite 中检索单个(且唯一)行的最简单方法

    我有这个 PDO stmt db gt prepare SELECT FROM channels WHERE id id stmt gt bindValue id id SQLITE3 INTEGER result stmt gt exec
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • 如何获取mysql中一条记录的大小

    如果表包含 TEXT 或 BLOB 类型的字段 如何获取 MySql 中记录的大小 是否可以使用sql语句获取记录或表的大小 要计算字符串或 blob 的大小 以字节为单位 请使用LENGTH YourColumn http dev mys
  • 避免 SQLite3 中的 SQL 注入

    我正在尝试找出一种避免 SQL 注入的好简单方法 到目前为止我只能提出两个想法 对用户输入进行 Base64 编码 其实不想这样做 使用正则表达式删除不需要的字符 目前正在使用这个 不确定是否100 安全 这是我当前的代码
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • 从外部 bash 设置环境变量

    我试图使用 PHP 从命令行 设置 bash 环境变量 但没有成功 buff array buff VARTESTKEY VARTESTVALUE buff export VARTESTKEY file put contents scrip
  • 使 div 的大小与其内部图像的大小相同

    我有一个带有以下代码的div HTML div img src img logo png div CSS div imgContainer width 250px height 250px padding 13px 问题是用户可以编辑图像大
  • WordPress 事件按元生效日期排序

    我在获取参数数组以按 Wordpress 中的日期对事件列表进行排序时遇到一些问题 我在 Stack Overflow 和其他地方找到了几个建议的解决方案 但经过大量的试验和错误后 这些解决方案似乎都不起作用 这没什么花哨的 而且应该比这容
  • 为什么运行 docker 容器后 mysql 数据所有权更改为 systemd-journal-remote

    我的mysql数据库存储在 home mysql代替 var lib mysql 该目录曾经属于mysql 但是 当我运行命令时docker compose up使用这个 yml 文件 version 3 services mariadb
  • NodeJS 和 PHP (Laravel) 集成用于 Socket.IO 实时聊天

    目前我有一个我写过的网站PHP通过Laravel 框架 我已经使用写了一个实时聊天nodeJS with 套接字IO and Express现在我想做的是将它集成到我已经编写的 Laravel 网站中 问题是聊天必须在主页中 当前由 Lar
  • 我的数据库有错误

    创建表时如下 create table Ticket ticket id integer not null primary key AirlineName varchar not null CustomerName varchar from

随机推荐

  • 无效 BFG 使用后的 Git 合并重复

    我对整个存储库 仅由我使用 深感厌烦 并且可以使用一些帮助来整理它 这就是我所做的 我意识到在我的提交历史记录中 有一些包含我不想随意放置的凭据的文件 因此 我决定合法地尝试使用 BFG Repo Cleaner 来解决这些问题 我将所有凭
  • 在 Go 中,如何在不使用 for 循环的情况下初始化数组?

    我有一个数组A布尔值 按整数索引0 to n 全部初始设置为true 我当前的实现是 for i 0 i lt n i A i true Using a for循环是最简单的解决方案 创建数组或切片将始终返回一个归零的值 哪种情况下bool
  • Python sys.path 修改不起作用

    我正在尝试修改我的 Python 文件之一中的 sys path 以获得一些 模块搜索路径中的特定库目录 这可能不是最好的方法 但 如果我在 sys path 前面插入多个路径 我的脚本不会考虑将来导入的这些路径 如果我创建一个包含我需要的
  • 如何获取 Oracle SQL 查询中错误的位置?

    如何获取查询中错误的位置 我需要获取导致错误的查询字符串中的位置 例如sqlplus可以 SQL gt insert into tbl data values 12345 2 insert into tbl data values 1234
  • ASP.Net - 从包含数据绑定的标记调用方法

    我在 ASP NET 中有一个用 C 编写的用户控件 该用户控件在代码隐藏中有一个方法 定义如下 protected string GetGreeting string name if String IsNullOrEmpty name r
  • 如何查找数组中的重复值?

    我正在 SQLite 上工作 我编写了一个查询 它返回两个数组 ItemsArray 和 CustomersIDArray 如下所示 ItemsArray Element at Index 0 Off White Element at In
  • iOS - 更新到新版本时保留旧的 sqlite 数据库

    我发现了一些其他问题 但我没有清楚地知道如何在 ios 中更新应用程序时保留旧数据库中的数据 情况1 我可以保留旧数据库吗 如果情况 1 为 是 我可以插入新列或在旧数据库中进行任何更改吗 这安全吗 如果情况 1 为 否 我可以在新数据库中
  • 在 asp.net mvc 3 中预填充 Html.TextBoxFor

    我对此很陌生 所以如果这还不够解释的话 我很抱歉 我想在 asp net mvc 3 的表单中预填充一个字段 这可行 Html TextBox CompName null new value ViewBag CompName 但是当我想用一
  • Spring boot - 如何获取运行端口和IP地址[重复]

    这个问题在这里已经有答案了 我在启动 Spring Boot 应用程序时通过 shell 脚本传递端口 想知道如何获取应用程序中的运行端口和系统IP地址以打印在日志文件中 脚本 Dcom sun management jmxremote D
  • 免费的java 3d引擎[关闭]

    Closed 这个问题是无关 目前不接受答案 适用于 java 的最佳 3D 游戏引擎是什么 我正在寻找具有良好的视觉开发工具集的东西 我已经查看了维基百科上的可用列表 http en wikipedia org wiki List of
  • ggplot 增加箱线图之间的距离

    如何避免附加箱线图 谢谢 ggplot df aes x factor time y val fill ID geom boxplot scale fill manual values c WT goldenrod3 KO steelblu
  • 设置 char* 缓冲区并中间转换为 int*

    我无法完全理解我在这里读到的内容的后果 将 int 指针转换为 char ptr 反之亦然 简而言之 这行得通吗 set4Bytes unsigned char buffer const uint32 t MASK 0xffffffff i
  • 无法在 D3 JavaScript 库中获取点击事件

    我正在使用 D3 JavaScript 库将数据显示为力定向标记 效果很好 但我无法将点击事件添加到圈子中 因此 当我单击圆圈时 我会获得对该圆圈的详细分析并将其显示在模式框中 var links source x target y typ
  • 将生成的 PIL 图像保存到 django 中的 ImageField 中

    我在用qrcode生成二维码 当购买门票或购买真实时 我想生成一个二维码图像并使用 PIL 进行一些更改 最后将修改后的画布保存到模型的Image字段中 class Ticket models Model booked at models
  • Angular ui 模式与控制器位于单独的 js 文件中

    我正在尝试制作一个可以从应用程序中的多个位置实例化的模式 从这里给出的例子 Bootstrap 的 Angular 指令模态控制器与实例化模态的控制器位于同一文件中 我想将模态控制器与 应用程序 控制器分开 索引 html
  • Inno Setup 组件的详细描述

    我正在使用 Inno Setup 构建安装 并使用组件部分来允许最终用户选择要安装的可选项目 其中一些项目需要更长的描述 以便用户有足够的信息来智能地选择它们 有没有办法在某处添加更深入的描述 此解决方案仅使用正确的 Inno Setup
  • 为什么 Qt Creator 3.0.0 欢迎模式在 VM 中不起作用?

    我最初在我的 Win7 64 位机器上安装了 Qt 5 20 和 Qt Creator 3 0 它运行得很好 然后我想将其安装到Win7 32位虚拟机中 使用VirtualBox 在虚拟机中 我从 qt project org 网站开始并下
  • javascript更改获取参数而不重定向[重复]

    这个问题在这里已经有答案了 如何只更改 get 参数而不重定向 parent location search after 20 ok that changes but also redirect to the new page 有什么解决办
  • 如何使用 pip 卸载可编辑包(使用 -e 安装)

    我已经用 e 安装了一些软件包 gt pip install e git https github com eventray horus git 2ce62c802ef5237be1c6b1a91dbf115ec284a619 egg ho
  • 替代 MySQL 的 UUID 版本 1 功能?

    Context Web 应用程序 PHP 5 MySQL 5 0 91 问题 我最近从使用自动递增整数改为使用 UUID 作为某些表的主键 通过 MySQL 生成 UUID 时UUID 功能 它们彼此非常相似 uuid 1e5988da a