Πώς να δημιουργήσετε ντετερμινιστικούς οδηγούς

Πώς να δημιουργήσετε ντετερμινιστικούς οδηγούς

Όπως αναφέρθηκε από τον @bacar, το RFC 4122 §4.3 ορίζει έναν τρόπο δημιουργίας ενός UUID που βασίζεται σε όνομα. Το πλεονέκτημα του να γίνει αυτό (σε σχέση μόνο με τη χρήση ενός κατακερματισμού MD5) είναι ότι είναι εγγυημένο ότι δεν θα συγκρούονται με UUID που δεν βασίζονται σε όνομα και έχουν μια πολύ (πολύ) μικρή πιθανότητα σύγκρουσης με άλλα UUID που βασίζονται σε ονόματα.

Δεν υπάρχει εγγενής υποστήριξη στο .NET Framework για τη δημιουργία αυτών, αλλά δημοσίευσα κώδικα στο GitHub που υλοποιεί τον αλγόριθμο. Μπορεί να χρησιμοποιηθεί ως εξής:

Guid guid = GuidUtility.Create(GuidUtility.UrlNamespace, filePath);

Για να μειώσετε ακόμη περισσότερο τον κίνδυνο συγκρούσεων με άλλα GUID, θα μπορούσατε να δημιουργήσετε ένα ιδιωτικό GUID για χρήση ως αναγνωριστικό χώρου ονομάτων (αντί να χρησιμοποιείτε το αναγνωριστικό χώρου ονομάτων διεύθυνσης URL που ορίζεται στο RFC).


Αυτό θα μετατρέψει οποιαδήποτε συμβολοσειρά σε Οδηγό χωρίς να χρειάζεται να εισαγάγετε μια εξωτερική διάταξη.

public static Guid ToGuid(string src)
{
    byte[] stringbytes = Encoding.UTF8.GetBytes(src);
    byte[] hashedBytes = new System.Security.Cryptography
        .SHA1CryptoServiceProvider()
        .ComputeHash(stringbytes);
    Array.Resize(ref hashedBytes, 16);
    return new Guid(hashedBytes);
}

Υπάρχουν πολύ καλύτεροι τρόποι για τη δημιουργία ενός μοναδικού Οδηγού, αλλά αυτός είναι ένας τρόπος για να αναβαθμίζετε συνεχώς ένα κλειδί δεδομένων συμβολοσειράς σε κλειδί δεδομένων οδηγού.


Όπως αναφέρει ο Rob, η μέθοδός σας δεν δημιουργεί UUID, δημιουργεί έναν κατακερματισμό που μοιάζει με UUID.

Το RFC 4122 σε UUID επιτρέπει συγκεκριμένα ντετερμινιστικές (βασισμένες στο όνομα) UUID - Οι εκδόσεις 3 και 5 χρησιμοποιούν md5 και SHA1 (αντίστοιχα). Οι περισσότεροι άνθρωποι είναι πιθανώς εξοικειωμένοι με την έκδοση 4, η οποία είναι τυχαία. Η Wikipedia παρέχει μια καλή επισκόπηση των εκδόσεων. (Λάβετε υπόψη ότι η χρήση της λέξης "έκδοση" εδώ φαίνεται να περιγράφει έναν "τύπο" UUID - η έκδοση 5 δεν υπερισχύει της έκδοσης 4).

Φαίνεται ότι υπάρχουν μερικές βιβλιοθήκες εκεί έξω για τη δημιουργία UUID της έκδοσης 3/5, συμπεριλαμβανομένης της ενότητας python uuid, του boost.uuid (C++) και του OSSP UUID. (Δεν έχω ψάξει για κανένα .net)