将Java的MessageDigest类与JRuby一起使用

时间:2018-06-28 15:28:38

标签: ruby-on-rails ruby jruby

我正在尝试使用Java的消息摘要类在Rails应用程序内部为大量文件计算md5哈希。我已经用JRuby在ruby脚本中编写了一些代码,但是对Files.readAllBytes()的调用给了我“#的未定义方法`getFileSystem'。这是我用红宝石编写的方法:

def calculate_md5_java(zip)
  require 'java'
  import java.security.MessageDigest
  import java.nio.file.Files
  import javax.xml.bind.DatatypeConverter
  import java.nio.file.FileSystems

  md = MessageDigest.getInstance("MD5")

  FileUtils.cp(zip, "GODPLEASELETTHISWORK.zip")

  Zip::File.open("GODPLEASELETTHISWORK.zip") do |z|
    z.each do |entry|
      md.update(Files.readAllBytes(entry.get_input_stream))
    end
  end

  digest = md.digest()
  DatatypeConverter.printHexBinary(digest).toLowerCase()
end

我也尝试将参数更改为

 md.update(entry.get_input_stream.read.bytes.to_a)

哪个给我:

no method 'update' for arguments (org.jruby.RubyArray) on Java::JavaSecurity::MessageDigest::Delegate available overloads: (byte) (java.nio.ByteBuffer) (byte[])

2 个答案:

答案 0 :(得分:0)

哦土豆!看起来有点复杂...可以接受吗?

data

对于它的价值,我正在使用此版本的JRuby和Java。

// With Attr
$_applozicWtLauncherBtn.attr('data-kr-id', seller.UserId);
// With Data
$_applozicWtLauncherBtn.data('kr-id', seller.UserId);

此外,还应付款:http://weblog.jamisbuck.org/2015/7/23/tar-gz-in-ruby.html

答案 1 :(得分:0)

我根据传递到此处的文件创建了一个Java File对象,然后将File.toPath传递给readAllBytes。 readAllBytes不需要字符串路径,但是需要Path对象。

def calculate_md5_java(xmls)
  require 'java'
  import java.security.MessageDigest
  import java.nio.file.Files
  import javax.xml.bind.DatatypeConverter
  import java.nio.file.FileSystems
  import java.io.ByteArrayOutputStream
  import java.io.DataOutputStream

  md = MessageDigest.getInstance("MD5")
  baos = ByteArrayOutputStream.new
  out = DataOutputStream.new(baos)

  xmls = Hash[xmls.sort_by { |k,v| k.tr(':', '-').to_s }]
  xmls.values.each do |xml|
    xml_file = java.io.File.new(xml.path)
    md.update(Files.readAllBytes(xml_file.toPath()))
  end

  digest = md.digest()
  md5 = DatatypeConverter.printHexBinary(digest)
  md5.downcase!
end