Müssen> 1000 aber <10000 neue Datensätze pro Tag verarbeiten
GUID / UUIDs, automatische Inkrementierungsnummern usw. können nicht verwendet werden.
Idealerweise sollte es 5 oder 6 Zeichen lang sein, kann natürlich Alpha sein
Möchte vorhandene, bekannte Algen wiederverwenden, falls verfügbar
Irgendwas da draußen?
Antworten:
Base 62 wird von tinyurl und bit.ly für die abgekürzten URLs verwendet. Es ist eine gut verstandene Methode zum Erstellen "eindeutiger", für Menschen lesbarer IDs. Natürlich müssen Sie die erstellten IDs speichern und bei der Erstellung nach Duplikaten suchen, um die Eindeutigkeit sicherzustellen. (Siehe Code unten in der Antwort)
Basis 62 Eindeutigkeitsmetriken
5 Zeichen in Basis 62 geben Ihnen 62 ^ 5 eindeutige IDs = 916.132.832 (~ 1 Milliarde) Bei 10.000 IDs pro Tag sind Sie für mehr als 91.000 Tage in Ordnung
6 Zeichen in Basis 62 geben Ihnen 62 ^ 6 eindeutige IDs = 56.800.235.584 (56+ Milliarden) Bei 10.000 IDs pro Tag sind Sie für mehr als 5 Millionen Tage in Ordnung
Basis 36 Eindeutigkeitsmetriken
6 Zeichen geben Ihnen 36 ^ 6 eindeutige IDs = 2.176.782.336 (2+ Milliarden)
7 Zeichen geben Ihnen 36 ^ 7 eindeutige IDs = 78.364.164.096 (78+ Milliarden)
Code:
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(); } }
Ausgabe:
quelle
Ich empfehle http://hashids.org/ , das eine beliebige Zahl (z. B. DB-ID) in eine Zeichenfolge (mit Salz) konvertiert.
Es ermöglicht das Dekodieren dieser Zeichenfolge zurück in die Nummer. Sie müssen es also nicht in der Datenbank speichern.
Hat Bibliotheken für JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Ziel-C, C, C ++ 11, Go, Erlang, Lua, Elixier, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript und für Node.js & .NET.
quelle
Ich hatte ähnliche Anforderungen wie das OP. Ich habe nach verfügbaren Bibliotheken gesucht, aber die meisten basieren auf Zufälligkeit, und das wollte ich nicht. Ich konnte nicht wirklich etwas finden, das nicht zufällig und dennoch sehr kurz war ... Also rollte ich mein eigenes basierend auf der von Flickr verwendeten Technik , modifizierte es jedoch, um weniger Koordination zu erfordern und längere Zeiträume offline zu ermöglichen.
Zusamenfassend:
Nachteile:
Vorteile
Ich habe sowohl eine Javascript-Bibliothek für die Client-Seite als auch eine Java EE-Server-Implementierung veröffentlicht. Die Implementierung von Servern in anderen Sprachen sollte ebenfalls einfach sein.
Hier sind die Projekte:
suid - Distributed Service - Eindeutige IDs, die kurz und bündig sind
suid-server-java - Suid-Server-Implementierung für den Java EE-Technologie-Stack.
Beide Bibliotheken stehen unter einer liberalen Open-Source-Lizenz von Creative Commons zur Verfügung. In der Hoffnung, dass dies jemand anderem hilft, nach kurzen eindeutigen IDs zu suchen.
quelle
suid
?Ich habe Base 36 verwendet, als ich dieses Problem für eine Anwendung gelöst habe, die ich vor ein paar Jahren entwickelt habe. Ich musste eine von Menschen lesbare, einigermaßen eindeutige Nummer generieren (jedenfalls innerhalb des aktuellen Kalenderjahres). Ich habe mich dafür entschieden, die Zeit in Millisekunden ab Mitternacht am 1. Januar des laufenden Jahres zu verwenden (damit die Zeitstempel jedes Jahr dupliziert werden können) und sie in eine Basiszahl 36 umzuwandeln. Wenn das zu entwickelnde System auf ein schwerwiegendes Problem stieß, wurde die Basis-36-Nummer (7 Zeichen) generiert, die einem Endbenutzer über die Weboberfläche angezeigt wurde. Dieser konnte das aufgetretene Problem (und die Nummer) an eine Person des technischen Supports weiterleiten könnte es dann verwenden, um den Punkt in den Protokollen zu finden, an dem der Stacktrace gestartet wurde). Eine Zahl wie 56af42g7ist für einen Benutzer unendlich einfacher zu lesen und weiterzuleiten als ein Zeitstempel wie 2016-01-21T15: 34: 29.933-08: 00 oder eine zufällige UUID wie 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578 .
quelle
Ich mag die Einfachheit, eine GUID einfach im Base64-Format zu codieren und die nachfolgende == abzuschneiden, um eine Zeichenfolge mit 22 Zeichen zu erhalten (es wird eine Codezeile benötigt, und Sie können sie jederzeit wieder in eine GUID konvertieren). Leider enthält es manchmal + und / Zeichen. OK für die Datenbank, nicht gut für URLs, aber es hat mir geholfen, die anderen Antworten zu schätzen :-)
Von https://www.codeproject.com/Tips/1236704/Reduzieren-der-String-Länge-von-a-Guid von Christiaan van Bergen
var newGuid = Guid.NewGuid(); var messageID = Convert.ToBase64String(newGuid.ToByteArray()); var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);
quelle