百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

提升用户体验的UUID设计策略

bigegpt 2024-09-04 02:59 3 浏览

本文翻译自 The UX of UUIDs,作者:Andreas Thomas, 略有删改。

唯一标识符在从用户身份验证到资源管理的所有应用程序中起着至关重要的作用。虽然使用标准UUID将满足您的所有安全问题,但我们可以为用户改进很多。

这篇文章讨论了唯一标识符(UUID)在应用程序中的重要性,以及如何通过一些改进来增强用户体验。

确保唯一性

唯一标识符对于区分系统中的各个实体至关重要。它们提供了一种可靠的方式,确保每个项目、用户或数据片段都有一个独特的身份。通过维持唯一性,应用程序可以有效地管理和组织信息,使操作更加高效,并促进数据的完整性。

任何安全生成的128位UUID对我们来说都足够了,有很多库可以生成UUID,或者你可以使用你选择的编程语言的标准库。在这篇博客中,我将使用Typescript示例,但基本思想适用于任何语言。

const id = crypto.randomUUID()
// '5727a4a4-9bba-41ae-b7fe-e69cf60bb0ab'

我们也可以止步于此,但我们做的更好,通过一些小的改进来增强用户体验:

  • 使它们易于复制
  • 添加前缀
  • 更高效的编码
  • 改变长度

复制UUID很麻烦

尝试通过双击它来复制以下UUID:

c6b10dd3-1dcf-416c-8ed8-ae561807fcaf

如果你幸运的话,你能复制整个UUID,但对大多数人来说,他们只得到了一个部分,提高唯一标识符可用性的一种方法是使它们易于复制。

这可以通过从UUID中移除连字符来实现,允许用户简单地双击标识符来复制。通过这个小改变可以大大改善用户在处理标识符时的体验。

在代码中移除连字符很简单,以下是如何在js/ts中做到这一点:

const id = crypto.randomUUID().replace(/-/g, "")
// fe4723eab07f408384a2c0f051696083

现在再试试复制它,感觉好多了!

添加前缀

我们可以通过添加一个有意义的前缀来帮助用户区分不同环境或系统中的资源。例如,Stripe使用像sk_live_这样的前缀来表示生产环境的密钥,或者使用cus_来表示客户标识符。通过增加这样的前缀,我们可以确保清晰度并减少混淆的可能性,特别是在多个环境共存的复杂系统中。

const id = `hello_${crypto.randomUUID().replace(/-/g, "")}`
// hello_1559debea64142f3b2d29f8b0f126041

命名前缀就像命名变量一样是一门艺术。你想要有描述性,但尽可能短。我稍后会分享我们的命名策略。

使用base58编码

除了使用十六进制表示标识符,我们还可以考虑更高效的编码方式,比如base58。Base58编码使用更大的字符集并避免使用模糊的字符,例如大写字母I和小写字母l,从而在不牺牲可读性的情况下生成更短的标识符字符串。

例如一个8个字符长的base58字符串,可以存储大约30,000倍于8个字符十六进制字符串的状态。在16个字符时,base58字符串可以存储889,054,070种组合。

你很可能仍然选择使用你语言的标准库来做到这一点,但你也可以使用像nanoid这样的库,它适用于大多数语言。

import { customAlphabet } from "nanoid";

export const nanoid = customAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");

const id = `prefix_${nanoid(22)}`
// prefix_KSPKGySWPqJWWWa37RqGaX

我们在这里生成了一个22个字符长的ID,它可以编码大约是UUID的100倍的数量,同时比UUID短10个字符。总数越多,说明可能重复的情况就越少。

-字符长度总数UUID16322^122 = 5.3e+36Base58582258^22 = 6.2e+38

改变长度

并非所有标识符都需要有高水平的碰撞抵抗力。在某些情况下,较短的标识符就足够了,这取决于应用程序的具体要求。通过减少标识符的长度,我们可以生成更短的ID,同时仍然保持可接受的唯一性水平。

减少ID的长度可能是好的,但你需要小心,并确保你的系统能够抵御ID冲突。幸运的是这一点可以在数据库层很容易做到,在我们的MySQL数据库中,我们主要将ID用作主键,数据库保护我们免受冲突。如果一个ID已经存在,我们只需生成一个新的并重试。如果我们的冲突率显著上升,我们可以简单地增加所有未来ID的长度。

长度示例总状态nanoid(8)re6ZkUUV1.3e+14nanoid(12)pfpPYdZGbZvw1.4e+21nanoid(16)sFDUZScHfZTfkLwk1.6e+28nanoid(24)u7vzXJL9cGqUeabGPAZ5XUJ2.1e+42nanoid(32)qkvPDeH6JyAsRhaZ3X4ZLDPSLFP7MnJz2.7e+56

实际使用

最后我想分享一下我们在这里的实现以及我们如何在代码库中使用它。我们使用一个简单的函数,它接受一个类型化的前缀,然后为我们生成ID。这样我们可以确保我们总是对同类型的ID使用相同的前缀。当你的系统中有多种类型的ID时,这特别有用。

import { customAlphabet } from "nanoid";

export const nanoid = customAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");

const prefixes = {
  key: "key",
  api: "api",
  policy: "pol",
  request: "req",
  workspace: "ws",
  keyAuth: "key_auth", // <-- 这是内部的,不需要短或漂亮
  vercelBinding: "vb",
  test: "test", // <-- 仅用于测试
} as const;

export function newId(prefix: keyof typeof prefixes): string {
  return [prefixes[prefix], nanoid(16)].join("_");
}

当我们在代码库中使用它时,我们可以确保总是对正确类型的ID使用正确的前缀。

import { newId } from "@unkey/id";

const id = newId("workspace")
// ws_dYuyGV3qMKvebjML

const id = newId("keyy")
// 无效,因为`keyy`不是有效的前缀名称

最后

本文讨论了在应用程序中使用唯一标识符(UUID)时通过以下方式提升用户体验。

  1. 简化复制:通过去除UUID中的连字符,可以让用户更容易地通过双击复制整个标识符。
  2. 添加前缀:使用有意义的前缀可以帮助用户区分不同环境或资源,例如Stripe使用特定的前缀来区分生产环境密钥和客户标识符。
  3. 高效编码:考虑使用如base58这样的编码方式,它使用更大的字符集并避免使用易混淆的字符,从而生成更短且可读性强的标识符字符串。
  4. 改变长度:根据应用的具体需求,可以通过减少标识符的长度来生成更短的ID,同时保持足够的唯一性。
  5. 数据库层的保护:在数据库层面,可以使用主键约束来防止ID冲突,如果冲突率上升,可以通过增加未来ID的长度来解决。

通过实施这些改进,我们可以增强应用程序中唯一标识符的可用性和效率。这将为用户和开发者提供更好的体验,因为他们与系统中的各种实体进行交互和管理。无论是轻松复制标识符、区分不同环境,还是实现更短、更易读的标识符字符串,这些策略都可以促进一个更用户友好和健壮的识别系统。


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~


作者:南城

来源-微信公众号:南城大前端

出处:https://mp.weixin.qq.com/s/m0IMJY_F4CcFFJ2KNIO15A

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...