Konvertieren C # CUSTOM getSHA512 Funktion in Rubin
Frage
Ich frage mich, wenn jemand helfen könnte mir diese Methode zu Rubin umgewandelt zu bekommen, ist dies möglich?
public static string getSHA512(string str){
UnicodeEncoding UE = new UnicodeEncoding();
byte[] HashValue = null;
byte[] MessageBytes = UE.GetBytes(str);
System.Security.Cryptography.SHA512Managed SHhash = new System.Security.Cryptography.SHA512Managed();
string strHex = "";
HashValue = SHhash.ComputeHash(MessageBytes);
foreach (byte b in HashValue){
strHex += string.Format("{0:x2}", b);
}
return strHex;
}
Vielen Dank im Voraus
UPDATE:
Ich möchte nur klarstellen, dass leider Methode es ist nicht nur für SHA512 Generation, sondern eine benutzerdefinierte ein. Ich glaube, dass die Digest :: SHA512.hexdigest nur die SHHast Instanz sein würde, aber wenn Sie genau für die Methode können Sie sehen, dass es ein bisschen von einer einfachen Hash-Generation unterscheidet. Folgt das Ergebnis der beiden Funktionen.
# in C#
getSHA512("hello") => "5165d592a6afe59f80d07436e35bd513b3055429916400a16c1adfa499c5a8ce03a370acdd4dc787d04350473bea71ea8345748578fc63ac91f8f95b6c140b93"
# in Ruby
Digest::SHA512.hexdigest("hello") || Digest::SHA2 => "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
Lösung
require 'digest/sha2'
class String
def sha512
Digest::SHA2.new(512).hexdigest(encode('UTF-16LE'))
end
end
'hello'.sha512 # => '5165d592a6afe59f80d07436e35bd…5748578fc63ac91f8f95b6c140b93'
Wie bei allen meinen Code-Schnipsel auf Stackoverflow, ich die neueste Version von Ruby immer annehmen. Hier ist eine, die auch mit Ruby-Werk 1.8:
require 'iconv'
require 'digest/sha2'
class String
def sha512(src_enc='UTF-8')
Digest::SHA2.new(512).hexdigest(Iconv.conv(src_enc, 'UTF-16LE', self))
end
end
'hello'.sha512 # => '5165d592a6afe59f80d07436e35bd…5748578fc63ac91f8f95b6c140b93'
Beachten Sie, dass in diesem Fall müssen Sie wissen und sagen Rubin über die die Zeichenfolge codiert, ist explizit in. In Ruby 1.9, weiß Rubin immer das, was ein String-Codierung ist in, und es wird entsprechend konvertieren, wenn erforderlich. Ich entschied ich für UTF-8 als Standard-Codierung, da es abwärtskompatibel mit ASCII ist, ist die Standard-Codierung im Internet und auch sonst weit verbreitet. Jedoch beispielsweise sowohl .NET- und Java-Anwendung UTF-16LE, nicht UTF-8. Wenn die Zeichenfolge nicht UTF-8 oder ASCII-codiert sind, werden Sie in dem Codierung Namen in die sha512
Methode übergeben müssen.
Off-Topic: 9 Zeilen Code reduziert 1. Ich liebe Rubin
Nun, eigentlich, dass ein wenig ist etwas unfair. Sie haben es geschrieben könnte so etwas wie folgt aus:
var messageBytes = new UnicodeEncoding().GetBytes(str);
var hashValue = new System.Security.Cryptography.SHA512Managed().
ComputeHash(messageBytes);
return hashValue.Aggregate<byte, string>("",
(s, b) => s += string.Format("{0:x2}", b)
);
Welche wirklich nur 3 Zeilen ist (aufgeschlüsselt in 5 für Stackoverflow Layout) und die meisten bekommt wichtiger rid, dass hässliche Stil der 1950er Jahre explizite for
Schleife für einen schönen Stil der 1960er und falten (aka. reduce
aka. inject
aka. Aggregate
aka. inject:into:
... es ist alles das gleiche).
Es ist wahrscheinlich ein noch eleganter Weg, dies zu schreiben, aber a) Ich weiß nicht wirklich C # und .NET und b) diese Frage zu Ruby. Fokus, Jörg, Fokus! : -)
aaand ... fand es:
return string.Join("", from b in hashValue select string.Format("{0:x2}", b));
I wußte es hatte eine äquivalent zu Rubys Enumerable#join
irgendwo sein, ich an der falschen Stelle nur hinsah.
Andere Tipps
Mit dem Digest :: SHA2 Klasse.