Convertir C # CUSTOM fonction getSHA512 en Ruby
Question
Je me demandais si quelqu'un pouvait me aider à obtenir cette méthode convertie en rubis, est-ce possible?
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;
}
Merci à l'avance
Mise à jour:
Je voudrais juste à préciser que, malheureusement, la méthode de c'est pas seulement pour la génération SHA512 mais un sur mesure. Je crois que le Digest :: SHA512.hexdigest serait juste l'instance SHHast, mais si vous regardez attentivement la méthode, vous pouvez voir qu'il diffère un peu d'une simple génération de hachage. Suit le résultat des deux fonctions.
# in C#
getSHA512("hello") => "5165d592a6afe59f80d07436e35bd513b3055429916400a16c1adfa499c5a8ce03a370acdd4dc787d04350473bea71ea8345748578fc63ac91f8f95b6c140b93"
# in Ruby
Digest::SHA512.hexdigest("hello") || Digest::SHA2 => "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
La solution
require 'digest/sha2'
class String
def sha512
Digest::SHA2.new(512).hexdigest(encode('UTF-16LE'))
end
end
'hello'.sha512 # => '5165d592a6afe59f80d07436e35bd…5748578fc63ac91f8f95b6c140b93'
Comme avec tous mes extraits de code sur StackOverflow, je suppose toujours la dernière version de Ruby. Voici un qui fonctionne aussi avec Ruby 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'
Notez que dans ce cas, vous devez savent et dire Ruby à propos de l'encodage de la chaîne est en explicitement. Dans Ruby 1.9, Ruby sait toujours ce codant pour une chaîne est, et convertira en conséquence, en cas de besoin. J'ai choisi comme encodage par défaut UTF-8, car il est rétrocompatible avec ASCII, le codage standard sur Internet et aussi par ailleurs largement utilisé. Cependant, par exemple à la fois l'utilisation .NET et Java UTF-16LE, pas UTF-8. Si votre chaîne n'est pas UTF-8 ou ASCII codés, vous devrez passer au nom d'encodage dans la méthode sha512
.
Hors sujet: 9 lignes de code réduit à 1. I love Ruby
Eh bien, en fait qui est un peu injuste. Vous auriez pu écrire quelque chose comme ceci:
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)
);
Ce qui est vraiment seulement 3 lignes (divisé en 5 pour la mise en page de StackOverflow) et surtout se débarrasser de cette vilaine style des années 1950 boucle explicite for
pour une belle-style années 1960 fold (aka. reduce
aka. inject
aka. Aggregate
aka. inject:into:
... il est tout de même).
Il y a probablement je ne sais pas vraiment façon d'écrire, mais a) encore plus élégante C # et .NET et b) cette question est à propos de Ruby. Mise au point, Jörg, mise au point! : -)
... aaand trouvé:
return string.Join("", from b in hashValue select string.Format("{0:x2}", b));
savait il devait y avoir un équivalent à quelque part de Enumerable#join
Ruby, je ne cherchait au mauvais endroit.
Autres conseils
Utilisez le Digest :: SHA2 classe.