Hashing in C# und PHP
Den meisten PHP-Entwicklern sind die beiden Funktionen
Diesen Klassen kann man über die
Die Rückgabe dieser Methode dürfte nun jedoch leider noch gar nicht dem entsprechen, was viele erwarten – die hexadezimale Schreibweise wie in PHP, so dass diese Ausgaben insbesondere nicht kompatibel zueinander für Vergleiche sind, was die Interoperabilität natürlich massiv beeinträchtigt. C# liefert standardmäßig nämlich das, was bei den entsprechenden PHP-Funktionen mit dem Parameter
Da die hexadezimale Darstellung jedoch tatsächlich häufig praktikabler ist, stützen wir uns ausnahmsweise (
) auf diese Vorgehensweise und bringen C# zu diesem – unter anderem von PHP gewohnten – Verhalten:
md5(…)
und sha1(…)
geläufig. Diese liefern zu einer übergebenen Zeichenkette einen Streuwert ("Hash") in hexadezimaler Darstellung. Zu diesem Zweck gibt es in C# die beiden Klassen MD5CryptoServiceProvider
und SHA1CryptoServiceProvider
.Diesen Klassen kann man über die
ComputeHash
-Methode unter anderem ein byte
-Array übergeben und bekommt daraufhin ein solches zurück, welches den Hash darstellt. Da wir es in der Praxis aber doch meist einfach nur mit Zeichenketten und u. U. auch mit verschiedenen Hash-Algorithmen (z. B. MD5, SHA1) zu tun haben, möchten wir das Ganze in eine komfortable generische Erweiterungsmethode für Zeichenketten verpacken:
Methode implementieren
Für diejenigen, denen die Arbeit mit generischen Typen (noch) nicht geläufig ist, werde ich in Kürze auch noch einen etwas ausführlicheren Beitrag zu diesem Thema verfassen.0102030405060708
public static string GetHash<T>(this string str) where T : HashAlgorithm, new() { using(T hashProvider = new T()) { // Streuwert berechnen byte[] hash = hashProvider.ComputeHash(Encoding.UTF8.GetBytes(str));
return Encoding.UTF8.GetString(hash); }}
Die Rückgabe dieser Methode dürfte nun jedoch leider noch gar nicht dem entsprechen, was viele erwarten – die hexadezimale Schreibweise wie in PHP, so dass diese Ausgaben insbesondere nicht kompatibel zueinander für Vergleiche sind, was die Interoperabilität natürlich massiv beeinträchtigt. C# liefert standardmäßig nämlich das, was bei den entsprechenden PHP-Funktionen mit dem Parameter
$raw_output
erhältlich ist.Da die hexadezimale Darstellung jedoch tatsächlich häufig praktikabler ist, stützen wir uns ausnahmsweise (

Methode implementieren (hexadezimale Rückgabe)
Jetzt liefert unsere Erweiterungsmethode für C# exakt das gleiche Ergebnis wie PHP das standardmäßig macht und kann darüber hinaus besonders einfach und flexibel auf jeder Zeichenkette verwendet werden:
Durch Übergabe der gewünschten Implementierung als Typparameter erhalten wir nun direkt das Ergebnis. 0102030405060708
public static string GetHash<T>(this string str) where T : HashAlgorithm, new() { using(T hashProvider = new T()) { // Streuwert berechnen byte[] hash = hashProvider.ComputeHash(Encoding.UTF8.GetBytes(str));
return BitConverter.ToString(hash).Replace("-", String.Empty).ToLower(); }}
Send eMails with C#
Weil mich diese Frage recht häufig erreicht, möchte ich hier einmal festhalten, wie man eine einfache eMail mit C# versenden kann. PHP-Entwickler verweisen dabei gerne auf die kompakte
Da das auch in C# sehr einfach ist, präsentiere ich direkt den Quelltext und setze verstärkt auf Auflistungsinitialisierer, womit sich die relevanten Stellen quasi von selbst kommentieren:
mail(…)
-Funktion.Da das auch in C# sehr einfach ist, präsentiere ich direkt den Quelltext und setze verstärkt auf Auflistungsinitialisierer, womit sich die relevanten Stellen quasi von selbst kommentieren:
eMail mit C# versenden
Wer keine weiteren Ansprüche wie HTML-Inhalt, Datei-Anhänge etc. hat, kann das eigentliche Senden durchaus auch mit einem Einzeiler – ähnlich wie in PHP – ohne das Erzeugen einer 0102030405060708091011121314151617181920
// SMTP-Client zum MailserverSmtpClient client = new SmtpClient("mail.domain.tld") { // Authentifizierungsdaten setzen Credentials = new NetworkCredential() { UserName = "Benutzername", Password = "Passwort" }};
// Nachricht erstellenMailMessage message = new MailMessage() { From = new MailAddress("absender@domain.tld", "Absender"), Subject = "Test", Body = "Text"};
message.To.Add(new MailAddress("empfänger@domain.tld", "Empfänger"));
// Nachricht versendenclient.Send(message);
MailMessage
bewerkstelligen:
eMail mit C# versenden (ohne MailMessage)
Für weitere Informationen zum Thema sollte man sich hauptsächlich den Namensraum 0102
// Nachricht versendenclient.Send("absender@domain.tld", "empfänger@domain.tld", "Test", "Text");
System.Net.Mail
im MSDN näher ansehen. An dieser Stelle auch noch einmal der Hinweis darauf, Ressourcen wieder freizugeben, worauf ich bei meinen Beispielen für gewöhnlich verzichte, um den Fokus auf das konkrete Beispiel zu legen. Website renewed
Since my website "grew" gradually I decided to give it a new design. Additionally, there is a chronologic archive available as of now.
I hope you like the new look, too. I'd be happy to see you again.
I hope you like the new look, too. I'd be happy to see you again.
New Year
I would like to wish you a happy New Year 2013 and thank you for your previous interest in my blog.
I would be very glad to see you again soon.
I would be very glad to see you again soon.
"??" Operator in C#
In meinem Beitrag zu NULL für Werttypen in C# hatte ich bereits beschrieben, wie man Werttypen in C# (z. B.
Nun kann es hin und wieder (z. B. zur Arbeit mit externen Bibliotheken) jedoch notwendig sein, diesen Wert einer Variable grundsätzlich gleichen Typs zuzuweisen, die jedoch kein
Im Übrigen funktioniert das mit beliebigen Referenztypen (deren Wert schließlich immer
bool
, int
) indirekt dazu bewegen kann, auch null
zu akzeptieren, was ansonsten ja nicht möglich ist.Nun kann es hin und wieder (z. B. zur Arbeit mit externen Bibliotheken) jedoch notwendig sein, diesen Wert einer Variable grundsätzlich gleichen Typs zuzuweisen, die jedoch kein
null
akzeptiert. Behelfen kann man sich in derartigen Fällen selbstverständlich mit Konstrukten wie diesem:
Zuweisung ohne
Etwas kompakter geht es jedoch mit dem ??
-Operator
010203040506
bool? isValid = null;
bool isRealValid = false;if(isValid.HasValue) { isRealValid = isValid.Value;} // "isRealValid" enthält "false", wenn "isValid" (ebenfalls) "false" oder "null" ist
??
-Operator (nicht zu verwechseln mit dem ternären ?:
-Operator):
Zuweisung mit
Der Wert hinter dem Operator dient also als Ersatzwert für ??
-Operator
01020304
bool? isValid = null;
bool isRealValid = isValid ?? false;// "isRealValid" enthält "false", wenn "isValid" (ebenfalls) "false" oder "null" ist
null
. In beiden Fällen gilt jedoch zu beachten, dass die ursprüngliche Semantik nicht erhalten bleibt. Einem reinen Werttyp kann nun einmal kein null
zugewiesen werden, d. h. man muss sich für diesen Fall einen angemessenen Ersatz (z. B. -1
für int
) suchen.Im Übrigen funktioniert das mit beliebigen Referenztypen (deren Wert schließlich immer
null
sein darf), womit sich beispielsweise bequem Standardobjekte zuweisen lassen:
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF