【问题标题】:How to generate unique Id based on the FirstName and LastName?如何根据 FirstName 和 LastName 生成唯一 ID?
【发布时间】:2019-03-08 00:13:08
【问题描述】:

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

我的想法:

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

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

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

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

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

我最有效的方法是使用 UUID 和子字符串 4-5 个起始字符。如果唯一 ID 已被占用,请尝试使用另一个 UUID。我认为这也是减少数据库往返次数的最佳选择。

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

【问题讨论】:

  • 1. 下的注释也适用于其他所有方法。所以我认为 1. 没有缺点
  • 第一点与另一点完全不同。对于1,我什至不知道MySql 将分配给新用户的ID。因此,在创建用户帐户时,我无法将其附加到用户唯一 ID。
  • 如果 MySQL 拒绝为配置文件创建记录(无论出于何种原因),您必须将其注册为创建用户帐户失败。这应该意味着创建用户帐户在 MySQL 请求完成之后结束,所以当你说在数据库记录之前必须有 URL 时,不清楚你的意思是什么。

标签: java mysql algorithm uniqueidentifier unique-id


【解决方案1】:

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

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

    • 开始新的交易
    • 在此表上发出select for update
    • 如果没有行,则 count = 1 & insert;否则递增计数器并更新
    • 提交

【讨论】:

  • 三个数据库调用只是为了创建单个用户? 1.`Select for update` 2.使用计数值并创建用户 3.更新计数值
  • 不幸的是……只是为了确保您不会让两个用户使用相同的“句柄”。
【解决方案2】:

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

它将以这种模式创建用户名

Arjun-Kumar-1

Arjun-Kumar-2

Arjun-Kumar-3

...

【讨论】:

  • 如果两个同名用户尝试在同一时间注册怎么办? count where firstname="" and lastname="" 将返回相同的值,并且唯一 ID 将被复制。
  • 是的有效案例,我们可以同步计数块,这会有所帮助
  • 我没听懂。如何同步计数块?
  • 我的意思是添加 synchronized { ...Code 从 db ..} 获取计数
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 性能怎么样?假设我想根据唯一 ID 搜索用户,在这种情况下,很难进行索引,因为要查找三个单独的列,而且与单个列相比,它的性能会更低。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      ----
      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。 创建提到的表,执行 Function 并尝试。

      Create table and Function Script

      【讨论】:

      • 您能否编辑您的答案以将代码包含为文本而不是图像?
      • 是 编辑了答案并粘贴在文本中。
      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2020-06-09
      • 2012-02-25
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多