In einem aktuellen Projekt stand ich vor genau diesem Problem. Ich hätte gerne eine eindeutige ID für jeden Datensatz verwendet, aber in der Datenquelle, eine einfache XML-Datei, gibt es keine. Ich könnte ja auch den Titel des Datensatz als ID verwenden, natürlich; aber Leerzeichen in einer ID wiederstreben mir einfach. Den Titel zu normalisieren währe auch eine Möglichkeit, aber ich wollt eine Guid als ID im Repository.

Wie also eine Guid verwenden, wenn in der Datenquelle keine vorhanden ist? Für jeden Datensatz eine erzeugen, ist sicherlich kein Problem. Dann aber erhält jeder Datensatz im Repository bei jedem neu laden der Datenquelle eine andere Guid; auch nicht schön. Ich wollte eine Guid, die eindeutig zu einem Datensatz gehört und bei jedem laden der Datenquelle immer die gleiche Guid zu einem Datensatz erzeugt wird.

Der Titel eines jeden Datensatz ist einmalig. Das war schon mal ein Ansatzpunkt. Also muss irgendwie aus einem Titel eine Guid erzeugt werden.
Wie sieht so eine Guid eigentlich aus? Sie ist lediglich eine gruppierte Hexadezimalziffer, 36 Zeichen lang und mit Bindestrichen als Trennsymbole. Also muss nur irgendwie der Titel, der ja als Zeichenfolge vorliegt, in eine Hexadezimalziffer umgewandelt werden. Das geht einfacher als mancher vieleicht jetzt denkt.

Es wird einfach ein MD5-Hash des Titel erzeugt. MD5 garantiert bei der Hashwerterzeugung immer den gleichen Wert bei gleicher Basiszeichenfolge. Da MD5 ein Array vom Typ byte erzeugt, braucht dieses Array nur noch in eine Zeichenfolge gewandelt zu werden, die als Hexadezimalziffer dargestellt wird. Auch der Umstand, dass MD5 eine Bytearray mit 16 Bytes erzeugt kommt da sehr gelegen. Jedes Byte wird mit der ToString Methode der Byte Struktur als Hexadezimal-Zeichenfolge dargestellt. Bis jetzt ist bereits eine Hexadezimalziffer mir 32 Zeichen erreicht. Jetzt nur noch die Bindestriche an der richtigen Stelle einfügen und die Guid ist fertig.

private static string CreateId(string input)
{
    var sb = new StringBuilder();
    var md5 = new MD5CryptoServiceProvider();
    var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
    // das byte-Array in einen Hex-String parsen
    foreach (var item in hash)
    {
        sb.Append(
			item.ToString("x2", CultureInfo.InvariantCulture));
    }
    // die Bindestriche einfügen
    sb.Insert(8, "-");
    sb.Insert(13, "-");
    sb.Insert(18, "-");
    sb.Insert(23, "-");
    return sb.ToString();
}

So komme ich zu meiner Guid als Datensatz-ID, die XML-Datei bleibt unverändert und ein neuer Blogartikel ist auch dabei entstanden.

Technorati-Tags: | |

Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de