【问题标题】:MD5 hash of a file in ABAPABAP中文件的MD5哈希
【发布时间】:2012-07-06 06:54:15
【问题描述】:

我想在 ABAP 中生成一个文本文件的 MD5 哈希值。我还没有找到任何标准的解决方案来为一个非常大的文件生成它。函数模块CALCULATE_HASH_FOR_CHAR不符合我的要求,因为它需要一个字符串作为输入参数。虽然它适用于较小的文件,但如果是 4 GB 的文件,则无法构造这么大的字符串。

是否有人知道是否有标准的代码可以做到这一点(我的谷歌努力没有给我带来任何东西)或者也许有人在 ABAP 中有一个 MD5 算法来计算文件的哈希?

【问题讨论】:

  • 您真的想为一个 4 GB 的文本文件创建一个哈希值吗?在这种情况下,您可能最好调用一些外部工具....
  • @vwegert:是的,我确定。例如,调用系统命令是不可能的,因为首先,我希望它独立于平台,其次,安全团队在生产中不允许任何系统命令调用,第三,哈希值将与来自的信息进行比较标头,必须在 ABAP 中完成。

标签: hash md5 abap


【解决方案1】:

看起来这个算法在ABAP 中是不可能实现的,因为该语言在计算过程中不允许算术溢出。这也应该回答了为什么到目前为止它还没有在 SAP 系统中实施的问题。无论哪种方式看起来都没有其他方法可以调用外部工具,遗憾的是,它几乎不独立于平台。

编辑:好的!因此,在 René 和 Fast MD5 Implementation in Java 的代码的大力帮助下,我创建了 implementation of MD5 algorithm in ABAP 。此实现允许使用更多字节更新计算的哈希值,这当然可能来自不同的来源。

到目前为止,还没有一种方法可以获取文件,但无论如何大部分工作已经完成。

代码中包含一些简单的 ABAP 单元测试,其中还记录了如何使用它。

【讨论】:

  • 感谢您分享您的工作 :) 我已经进行了几次测试,到目前为止它似乎工作正常。不过真的很慢;我正在测试的系统大约需要 6 分钟才能散列一个 1MB 的文件。
  • 运行时分析告诉我,按位左移方法占用大约 65% 的时间,按位加法大约占 20%。看来我得想办法优化这些方法了。
  • 我尝试了一个 2MB 的文件,但花了 13 分钟多一点。在我的例子中,运行时分析显示左移方法使用了 75% 的时间。
  • 在其他机器上使用不同的操作系统完成的另一项测试。文件大小 1,2 MB,处理时间 3:30。对开头的left_shift_i 稍作调整CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 4 OTHERS = 8. returning = value * 2 ** positions. ENDCATCH. IF sy-subrc <> 0. *your code* ENDIF. 运行时间为2 分51 秒。
  • 我简化了left_shift_i(归零的最终循环是多余的)并将其包含在github:gist上的新版本中
【解决方案2】:

也许您可以读取几兆字节的数据块中的文件,并使用建议的函数创建一个哈希列表。然后使用生成的哈希列表创建单个顶部哈希。

【讨论】:

  • 恐怕这是不可能的,因为MD5哈希函数不满足这个条件f(x1 + x2 + ... +xn) = f(x1) + f(x2) + ... + f(xn)
  • 你确定吗?其他语言似乎具有允许您以这种方式处理大文件的实现。例如在PHP.
  • 是的,我很确定。 PHP 的函数是hash_updateABAP好像没有这个功能。 CALCULATE_HASH_FOR_RAWCALCULATE_HASH_FOR_CHAR 不能这样工作。他们只是计算给定字符串或字节序列的哈希值,你不能继续给它们提供更多字节。
  • 那么让我们看看赏金是否会给我们一个好的答案:)
  • 我非常绝望,开始用update函数编写MD5算法的实现。不幸的是,我收到了CX_SY_ARITHMETIC_OVERFLOW 异常。有人知道是否有一个选项可以关闭检查ABAP 中是否存在算术溢出?
【解决方案3】:

SDN 通常是寻找 ABAP 相关解决方案的一个很好的起点。我找到了这篇文章:http://scn.sap.com/thread/1483479

作者建议:

  • 将 .txt 文件上传为 BIN。
  • 使用函数 MD5_CALCULATE_HASH_FOR_RAW 计算哈希码

您能否获取二进制格式的文件并使用MD5_CALCULATE_HASH_FOR_RAW

编辑:这篇文章甚至有更详细的答案,使用CALCULATE_HASH_FOR_RAWhttp://scn.sap.com/thread/1298723

引用 Shivanand Kalagi 的回答:

STR_LEN = XSTRLEN( DATA ).

CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
  EXPORTING
    ALG            = 'MD5'
    DATA           = DATA
    LENGTH         = STR_LEN
  IMPORTING
    HASH           = L_MD5_HASH.

【讨论】:

  • 恐怕这行不通,因为这个功能模块和CALCULATE_HASH_FOR_CHAR提到的完全一样,所有数据都必须加载到一个内部表DATA中,例如这没有任何意义对于 8 GB 文件。
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2020-12-08
  • 2017-07-08
相关资源
最近更新 更多