Wie erstelle ich benutzerfreundliche, eindeutige Spiel-IDs?

11

Wie erstelle ich eindeutige Spiel-IDs, die auch benutzerfreundlich sind, sodass ein Benutzer diese Spiel-ID problemlos an eine andere Person weitergeben kann, um am Spiel teilzunehmen?

Ich erstelle mein Spiel in Silverlight mit C #.

Zain Shaikh
quelle
3
Dies ist weniger eine Antwort, also schlechter Kommentar. Ich habe ein 2-Schlüssel-System verwendet. Ich habe einen eindeutigen Schlüssel (UUID) generiert, den ich intern speichere. Ähnlich wie folgt: 39d7e998-e654-4f8b-9e4b-0e61fe9eaf65. Nachdem ich eine eindeutige ID erstellt habe, können die Freunde des Spielers sein Profil finden, indem sie nach seinem Spitznamen suchen und die ersten 4 Buchstaben verwenden. Die Wahrscheinlichkeit, dass es 2 'Microdude: 39d7' gibt, ist ziemlich gering. Wenn ich Kollisionen sehe, kann ich es die ersten 5 oder 6 machen. Seinen einzigartigen Schlüssel 39d7e machen. Dies ist offensichtlich öffentlich (die Charaktere), so dass seine Freunde ihn direkt hinzufügen können, und hilft bei der Angabe, wenn Spiele über IM oder Chat erstellt werden.
unterstrichene
Wie lange müssen die Schlüssel gültig bleiben? Dies würde beeinflussen, wie eindeutig sie sein müssen und ob Sie alte Schlüssel wiederverwenden können oder nicht.
Tim Holt
@Tim die Schlüssel könnten höchstens 2 Stunden gültig sein.
Zain Shaikh

Antworten:

6

Wenn Sie eine maßgebliche Quelle haben, ist dieses Problem einfach (was ich annehme, wenn der Benutzer eine ID eingibt, um eine Verbindung zu einem Spiel herzustellen, wird diese über einen zentralen Server umgeleitet). Verwenden Sie einfach einen Algorithmus wie http://www.safepasswd.com/ , um UIDs zu erstellen, die im Grunde Wörterbuchwörter + kleine Zahlen sind. Wenn die Anzahl der Server relativ gering ist, können Sie sogar einen naiven Algorithmus verwenden, der nur etwas Zufälliges auswählt, bis es derzeit nicht verwendet wird.

Wenn Sie möchten, dass Ihre Clients die Quelle der UIDs sind, müssen Sie den benutzerfreundlichen Teil dieser IDs wegwerfen. Auf der Codierungsseite ist dies jedoch einfacher, da Sie nur System.Guid.NewGuid (). ToString () verwenden würden. Das ist in jeder Hinsicht garantiert 100% der Zeit einzigartig. Quelle

Andererseits sind GUIDs ein wenig übertrieben. Es wäre einfacher, sich IPs oder Benutzernamen zu merken. B.

Tetrad
quelle
gut, ich denke ich sollte mit Benutzernamen gehen, zumindest werden sie nicht doppelt sein, und sie sind sogar benutzerfreundlich. danke :)
Zain Shaikh
3

Ein Ansatz wäre, ein Wörterbuch zu verwenden und Wörter basierend auf einem Nummerierungsschema auszuwählen. Verwenden Sie möglicherweise eine eindeutige 32-Bit-Ganzzahl, um jeden Benutzer zu identifizieren, und indizieren Sie für jedes der 16-Bit-Wörter ein Wörterbuch (Array von Wörtern). Auf diese Weise können Sie ihre ID mit tatsächlichen Wörtern darstellen, und jeder Bezeichner wäre eindeutig.

Ein anderer Ansatz wäre, etwas Ähnliches zu implementieren, wie es Steam verwendet: Ermöglichen Sie Benutzern, sich mit einer von ihnen selbst gewählten ID anzumelden, und lassen Sie sie später eine beliebige Anzeige-ID angeben. Zum Beispiel könnte ihre Login-ID ihre E-Mail-Adresse und ihr Anzeigename ihr Vorname sein. Auf diese Weise kann der Benutzer seine eindeutige Kennung teilen, aber auch durch einen Namen seiner Wahl identifiziert werden.

Reverbb
quelle
Vielen Dank für Ihren Vorschlag. Ich werde jetzt Benutzernamen als eindeutigen Schlüssel verwenden, wie von @Tetrad vorgeschlagen.
Zain Shaikh
3

Die Antwort von FuzzYspo0N in den Kommentaren ist sehr gut. Grundsätzlich läuft dieses Problem darauf hinaus, Spiel-IDs so eindeutig zu machen, dass Kollisionen vermieden werden, ohne sie willkürlich komplex zu machen. Standardmäßige 128-Bit-GUIDs erhalten ihre Eindeutigkeit, indem sie lokale Informationen (wie Ihren MAC und andere Faktoren) verwenden, um die Wahrscheinlichkeit einer Kollision zwischen Maschinen sehr gering zu machen. Fügen Sie dann einen zufälligen und zeitbasierten Faktor hinzu, um die Wahrscheinlichkeit einer Kollision innerhalb dieser Maschine zu bestimmen sehr klein.

Sie können dieselbe Strategie verfolgen, um Ihre eigenen IDs zu generieren. Beginnen Sie mit etwas, das für den Benutzer einprägsam, aber relativ eindeutig ist (wenn der Benutzer einen globalen Benutzernamen hat, der ein guter Start ist, oder den Computernamen / die IP), und fügen Sie weitere Faktoren hinzu, bis Sie etwas Einzigartiges generiert haben. Indem Sie einen lokalen Namen wie den Computernamen auswählen, beschränken Sie die Anzahl möglicher Kollisionen so weit, dass Sie mit der Abfrage beginnen können, falls vorhanden. Wenn Sie es beispielsweise nur auf diesen Benutzer oder nur auf diesen Computer beschränkt haben, wissen Sie genau, wohin Sie gehen müssen, um zu überprüfen, ob diese UID bereits verwendet wird oder nicht.

Wenn ich beispielsweise weiß, dass mein Benutzername systemweit eindeutig ist, ist MrCranky: 1 eine gültige UID. Wenn ich überprüfen kann, ob MrCranky: 1 bereits verwendet wird (mit einer anderen Methode), kann ich einfach weiter Zahlen versuchen, bis ich eine eindeutige finde.

Durch die Verwendung eines anderen Faktors (wie Zufälligkeit oder Zeit) kann ich die Wahrscheinlichkeit erhöhen, dass ich beim ersten Mal eine nicht verwendete ID auswähle. Wenn Sie beispielsweise wissen, dass Sie nicht mehr als eine Sitzung pro Sekunde erstellen können, erhält ich mit MrCranky: 122730 (die aktuelle Zeit bis zur Sekunde) eine eindeutige ID, die für den Benutzer relativ einprägsam ist.

Solange Sie eine relativ eindeutige Information haben (muss nicht perfekt sein, sondern meistens eindeutig), können Sie diese als Startblock verwenden, und das bedeutet, dass der wirklich eindeutige Teil (ein ganzzahliger Code) dies kann viel viel kürzer sein, und somit ist die UID einprägsamer.

MrCranky
quelle
Vielen Dank für Ihren Vorschlag. Ich werde jetzt Benutzernamen als eindeutigen Schlüssel verwenden, wie von @Tetrad vorgeschlagen.
Zain Shaikh
0

Sie können die E-Mail-Adresse eines Spielers als eindeutige Kennung verwenden. Ich bin sicher, sie können sich daran erinnern :)

Adamk
quelle
Vielen Dank für Ihren Vorschlag. Ich werde jetzt Benutzernamen als eindeutigen Schlüssel verwenden, wie von @Tetrad vorgeschlagen.
Zain Shaikh