簡體   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