ต้องจัดการ> 1,000 แต่ <10,000 บันทึกใหม่ต่อวัน
ไม่สามารถใช้ GUID / UUID หมายเลขเพิ่มอัตโนมัติเป็นต้น
ตามหลักการแล้วควรมีความยาว 5 หรือ 6 ตัวอักษรสามารถเป็นอัลฟ่าได้แน่นอน
ต้องการนำอัลกอสที่มีอยู่ซึ่งเป็นที่รู้จักกันดีมาใช้ซ้ำหากมี
มีอะไรอีกไหม?
ต้องจัดการ> 1,000 แต่ <10,000 บันทึกใหม่ต่อวัน
ไม่สามารถใช้ GUID / UUID หมายเลขเพิ่มอัตโนมัติเป็นต้น
ตามหลักการแล้วควรมีความยาว 5 หรือ 6 ตัวอักษรสามารถเป็นอัลฟ่าได้แน่นอน
ต้องการนำอัลกอสที่มีอยู่ซึ่งเป็นที่รู้จักกันดีมาใช้ซ้ำหากมี
มีอะไรอีกไหม?
คำตอบ:
ฐาน 62 ใช้โดย tinyurl และ bit.ly สำหรับ URL แบบย่อ เป็นวิธีการที่เข้าใจกันดีในการสร้าง ID ที่ "ไม่ซ้ำใคร" ซึ่งมนุษย์สามารถอ่านได้ แน่นอนคุณจะต้องจัดเก็บ ID ที่สร้างขึ้นและตรวจสอบรายการที่ซ้ำกันในการสร้างเพื่อให้แน่ใจว่าไม่ซ้ำกัน (ดูรหัสที่ด้านล่างของคำตอบ)
เมตริกฐาน 62 ความเป็นเอกลักษณ์
5 ตัวอักษรในฐาน 62 จะให้ ID เฉพาะ 62 ^ 5 = 916,132,832 (~ 1 พันล้าน) ที่ 10k ID ต่อวันคุณจะใช้ได้ 91k + วัน
6 ตัวอักษรในฐาน 62 จะให้ 62 ^ 6 ID ที่ไม่ซ้ำกัน = 56,800,235,584 (56+ พันล้าน) ที่ 10k ID ต่อวันคุณจะใช้ได้เป็นเวลา 5+ ล้านวัน
ตัวชี้วัดความเป็นเอกลักษณ์ฐาน 36
6 ตัวอักษรจะให้ ID เฉพาะ 36 ^ 6 = 2,176,782,336 (2+ พันล้าน)
7 ตัวอักษรจะให้ ID เฉพาะ 36 ^ 7 = 78,364,164,096 (78+ พันล้าน)
รหัส:
public void TestRandomIdGenerator()
{
// create five IDs of six, base 62 characters
for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6));
// create five IDs of eight base 36 characters
for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8));
}
public static class RandomIdGenerator
{
private static char[] _base62chars =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
.ToCharArray();
private static Random _random = new Random();
public static string GetBase62(int length)
{
var sb = new StringBuilder(length);
for (int i=0; i<length; i++)
sb.Append(_base62chars[_random.Next(62)]);
return sb.ToString();
}
public static string GetBase36(int length)
{
var sb = new StringBuilder(length);
for (int i=0; i<length; i++)
sb.Append(_base62chars[_random.Next(36)]);
return sb.ToString();
}
}
เอาท์พุต:
z5KyMg wd4SUp uSzQtH UPrGAT UIf2IS QCF9GNM5 0UV3TFSS 3MG91VKP 7NTRF10T AJK3AJU7
ฉันแนะนำhttp://hashids.org/ซึ่งแปลงตัวเลขใด ๆ (เช่น DB ID) เป็นสตริง (โดยใช้เกลือ)
อนุญาตให้ถอดรหัสสตริงนี้กลับไปเป็นตัวเลข คุณจึงไม่จำเป็นต้องเก็บไว้ในฐานข้อมูล
มี libs สำหรับ JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C ++ 11, Go, Erlang, Lua, Elixir, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript และสำหรับ Node.js & .NET
ฉันมีข้อกำหนดที่คล้ายกันกับ OP ฉันดูห้องสมุดที่มีอยู่ แต่ส่วนใหญ่จะขึ้นอยู่กับการสุ่มและฉันไม่ต้องการสิ่งนั้น ฉันไม่พบสิ่งที่ไม่ได้ขึ้นอยู่กับการสุ่มและยังสั้นมาก ... ดังนั้นฉันจึงลงเอยด้วยการหมุนของตัวเองโดยใช้เทคนิคที่ Flickr ใช้แต่แก้ไขให้ต้องการการประสานงานน้อยลงและอนุญาตให้ออฟไลน์นานขึ้น
ในระยะสั้น:
ข้อเสีย:
ข้อดี
ฉันได้เผยแพร่ทั้งไลบรารี Javascript สำหรับฝั่งไคลเอ็นต์ตลอดจนการใช้งานเซิร์ฟเวอร์ Java EE การติดตั้งเซิร์ฟเวอร์ในภาษาอื่นควรทำได้ง่ายเช่นกัน
นี่คือโครงการ:
suid - รหัสเฉพาะบริการแบบกระจายที่สั้นและไพเราะ
suid-server-java - การติดตั้ง Suid-server สำหรับสแตกเทคโนโลยี Java EE
ไลบรารีทั้งสองมีให้บริการภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบเสรีนิยม หวังว่านี่อาจช่วยให้คนอื่นมองหารหัสเฉพาะสั้น ๆ
suid
ไหม
ฉันใช้ฐาน 36เมื่อฉันแก้ไขปัญหานี้สำหรับแอปพลิเคชันที่ฉันกำลังพัฒนาเมื่อสองสามปีก่อน ฉันต้องการสร้างหมายเลขที่ไม่ซ้ำกันที่มนุษย์สามารถอ่านได้อย่างสมเหตุสมผล (ภายในปีปฏิทินปัจจุบันอยู่ดี) ฉันเลือกใช้เวลาเป็นมิลลิวินาทีตั้งแต่เที่ยงคืนของวันที่ 1 มกราคมของปีปัจจุบัน (ดังนั้นในแต่ละปีการประทับเวลาอาจซ้ำกันได้) และแปลงเป็นเลขฐาน 36 หากระบบที่กำลังพัฒนาประสบปัญหาร้ายแรงระบบจะสร้างหมายเลขฐาน 36 (7 ตัวอักษร) ที่แสดงต่อผู้ใช้ปลายทางผ่านทางเว็บอินเทอร์เฟซซึ่งสามารถถ่ายทอดปัญหาที่พบ (และหมายเลข) ไปยังผู้สนับสนุนด้านเทคนิค (who จากนั้นสามารถใช้เพื่อค้นหาจุดในบันทึกที่ stacktrace เริ่มต้น) ตัวเลขเช่น56af42g7เป็นอนันต์ง่ายขึ้นสำหรับผู้ใช้ในการอ่านและการถ่ายทอดกว่าการประทับเวลาเช่น2016-01-21T15: 34: 29.933-08: 00หรือ UUID สุ่มเช่น5f0d3e0c-da96-11e5-b5d2-0a1d41d68578
ฉันชอบความเรียบง่ายของการเข้ารหัส GUID โดยใช้รูปแบบ Base64 และตัดทอนท้าย == เพื่อให้ได้สตริง 22 อักขระ (ใช้โค้ดหนึ่งบรรทัดและคุณสามารถแปลงกลับเป็น GUID ได้ตลอดเวลา) น่าเศร้าที่บางครั้งอาจมีอักขระ + และ / ใช้ได้สำหรับฐานข้อมูลไม่ดีสำหรับ URL แต่ช่วยให้ฉันขอบคุณคำตอบอื่น ๆ :-)
จากhttps://www.codeproject.com/Tips/1236704/Reducing-the-string-Length-of-a-Guidโดย Christiaan van Bergen
เราพบว่าการแปลง Guid (16 ไบต์) เป็นการแสดง ASCII โดยใช้ Base64 ทำให้มีmessageID ที่ใช้งานได้และยังคงไม่ซ้ำกันเพียง 22 อักขระ
var newGuid = Guid.NewGuid();
var messageID = Convert.ToBase64String(newGuid.ToByteArray());
var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);
ตัวอย่างเช่น Guid 'e6248889-2a12-405a-b06d-9695b82c0a9c' (ความยาวสตริง: 36) จะได้รับการแทนค่า Base64: 'iYgk5hIqWkCwbZaVuCwKnA ==' (ความยาวสตริง: 24)
การแทนค่า Base64 ลงท้ายด้วยอักขระ '==' คุณสามารถตัดทอนสิ่งเหล่านี้โดยไม่ส่งผลกระทบต่อความเป็นเอกลักษณ์ ปล่อยให้คุณมีตัวระบุที่มีความยาวเพียง 22 อักขระ