繁体   English   中英

如何根据名字和姓氏生成唯一的 ID?

[英]How to generate unique Id based on the FirstName and LastName?

已经提出了类似的问题,但我的问题与对其进行的一些研究截然不同。
在注册网站时,我提供
名字:Ajay,姓氏:Kumar
现在后端 API 需要从这两个文本创建一个唯一的 ID。 为什么?
是的,我使用了自动增量整数列来存储用户 ID,但这是 Unique_id,它将显示在用户个人资料页面的 URL 中,这是大多数网站(fb、twitter、quora)的做法。 我认为它有助于 SEO 搜索人们的个人资料。

我心目中的方法:

1.名字+姓氏+mysql-auto-generated-id
API 在创建用户之前无法知道自动生成的 ID。

2. Concat FirstName & LastName 并将其用作唯一的 id,如果 DB 失败并返回 id 违规错误,则开始从 0 开始附加数字,直到找到有效的 Id。
它增加了数据库往返。

3.名字+姓氏+[随机整数]
它还增加了数据库往返。

4. 使用连接到 FirstName + LastName 的 UUID。
由于 UUID 是 128 位,所以它很长,我需要对它进行子串。 这可能会再次导致重复的 ID

5. 将当前时间戳与 FirstName + LastName 连接起来。
但那个值也很长。

我拥有的最有效的方法是使用 UUID 和子串 4-5 个起始字符。 如果已经使用了 unique-id,请尝试使用另一个 UUID。 我认为这对于减少数据库往返也是最好的。

我很想知道网站如何处理这个(除了这个数据库递归调用,直到找到一个有效的唯一 ID)? unique-id 中有适当的数字分配(例如在Quora 中)。 例如tim-cook-1time-cook-2

我假设您正在使用MySQL。 这是处理并发请求的可能解决方案:

  1. 创建一个表(first_name, last_name, count)
  2. 当您收到新的用户注册请求时:

    • 开始新交易
    • 发出此表的select for update
    • 如果没有行,则计数= 1并插入; 否则增加计数器并更新
    • 承诺

您可以只从数据库中获取记录的count + 1,并将其名字添加为“ Arjun”,将姓氏添加为“ Kumar”,然后将其添加到您的用户名中

它将以此模式创建用户名

阿琼 - 库马尔 - 1

阿琼 - 库马尔-2

阿琼 - 库马尔 - 3

...

UUID是一个很好的工具。 您还可以在使用node.js时尝试使用Crypto模块

我在这里看不到问题。 保存对象,然后从名称和现有ID创建URL,并将其返回给客户端。 您甚至不必单独存储该唯一ID,因为您可以随时从其他三个字段轻松构建它。

您可以使用以下生成器并选择附加到firstname-surname- [uniquenumber]上的唯一字符串必须多长时间。

https://alex7kom.github.io/nano-nanoid-cc/?alphabet=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&size=8&speed=1000&speedUnit=second

如果对数据库中的这个firstname-surname- [uniquenumber]字段进行唯一约束,则可以检测到冲突,然后再次重新生成一个唯一编号。

 ---- CREATE TABLE name_card (id INT(10) AUTO_INCREMENT, name_card VARCHAR(200), value_card VARCHAR(200), PRIMARY KEY(id)); ---- ---- DELIMITER $$ DROP FUNCTION IF EXISTS unicode_function$$ CREATE FUNCTION unicode_function (name_ VARCHAR(200)) RETURNS VARCHAR(200) BEGIN DECLARE var INT(10); DECLARE nam VARCHAR(100); SET var=500; IF EXISTS(SELECT name_card FROM name_card WHERE name_card=name_) THEN SELECT value_card INTO nam FROM name_card WHERE name_card=name_; RETURN nam; ELSE INSERT INTO name_card(name_card,value_card) SELECT name_,(SELECT IFNULL((MAX(value_card)+1),var) value_card FROM name_card); SELECT value_card INTO nam FROM name_card WHERE name_card=name_; RETURN nam; END IF; END$$ DELIMITER ; ----

根据给定的名称下面的函数生成唯一的 id。 创建一个提到的表,执行函数并尝试。

创建表和函数脚本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM