Hash ABAP中文件的MD5哈希

Hash ABAP中文件的MD5哈希,hash,md5,abap,Hash,Md5,Abap,我想在ABAP中生成文本文件的MD5哈希。我还没有找到任何标准的解决方案来生成一个非常大的文件。函数模块CALCULATE\u HASH\u FOR\u CHAR不符合我的要求,因为它将字符串作为输入参数。虽然它适用于较小的文件,但在例如4GB文件的情况下,无法构造如此大的字符串 有人知道是否有一个标准的编码来实现这一点(我在谷歌的努力没有给我带来任何东西),或者有人在ABAP中有一个MD5算法来计算文件的散列吗?SDN通常是找到ABAP相关解决方案的一个很好的起点。我找到了这个帖子: 作者建议

我想在ABAP中生成文本文件的MD5哈希。我还没有找到任何标准的解决方案来生成一个非常大的文件。函数模块
CALCULATE\u HASH\u FOR\u CHAR
不符合我的要求,因为它将字符串作为输入参数。虽然它适用于较小的文件,但在例如4GB文件的情况下,无法构造如此大的字符串


有人知道是否有一个标准的编码来实现这一点(我在谷歌的努力没有给我带来任何东西),或者有人在ABAP中有一个MD5算法来计算文件的散列吗?

SDN通常是找到ABAP相关解决方案的一个很好的起点。我找到了这个帖子:

作者建议:

  • 上传.txt文件,但作为BIN
  • 使用函数MD5\u Calculate\u hash\u为\u RAW计算哈希代码
您是否能够以二进制格式获取文件并对原始文件使用
MD5\u CALCULATE\u HASH\u

编辑:这篇文章甚至有一个更详细的答案,使用
CALCULATE\u HASH\u FOR\u RAW

引用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.

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

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

编辑:好的!因此,在勒内和代码的大力帮助下,我创建了。此实现允许使用更多字节更新计算出的哈希,当然这些字节可能来自不同的源

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


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

您真的想为4 GB文本文件创建哈希吗?在这种情况下,你最好调用一些外部工具……@vwegert:是的,我确定。例如,调用一个系统命令是不可能的,因为第一,我希望它是平台独立的,第二,安全团队不允许在生产中调用任何系统命令,第三,散列将与来自标题的信息进行比较,并且必须在ABAP中进行。我担心这不会起作用,因为此功能模块与前面提到的
CALCULATE\u hash\u FOR\u CHAR
完全相同,所有数据都必须加载到一个内部表数据中,这没有任何意义,例如对于8GB文件。我恐怕这是不可能的,因为MD5哈希函数不满足这样的条件
f(x1+x2+…+xn)=f(x1)+f(x2)+…+f(xn)
。你确定吗?其他语言的实现似乎允许您以这种方式处理大型文件。例如,是的,我很肯定。PHP中的函数是
hash\u update
。似乎在
ABAP
中没有这样的功能<代码>计算\u散列\u的原始值
计算\u散列\u的字符
不以这种方式工作。他们只计算给定字符串或字节序列的哈希值,而你不能继续向他们输入更多字节。那么,让我们看看悬赏是否能给我们一个好的答案:)我非常绝望,以至于我开始编写一个带有
update
函数的MD5算法的实现。不幸的是,我得到了
CX\u SY\u算术\u溢出
异常。是否有人知道是否有选项可以关闭检查
ABAP
中是否存在算术溢出?感谢分享您的工作:)我已经做了几个测试,到目前为止,它似乎工作正常。但是它真的很慢;我正在测试的系统大约需要6分钟来散列一个1MB的文件。运行时分析告诉我按位左移方法大约占用65%的时间,按位加法大约占20%。看来我必须找到一种方法来优化这些方法。我尝试了一个2MB的文件,花了13分钟多一点。在我的例子中,运行时分析显示了左移位方法使用的75%的时间。另一个测试是在其他机器上使用不同的操作系统进行的。文件大小为1.2MB,处理时间为3:30。在开头的
左移位\u i
中稍微调整一下
捕获系统异常算术错误=4其他=8。返回=值*2**位置。收尾。如果sy subrc为0*您的代码*ENDIF.
运行时间为2分51秒。我简化了
左移位
(调零的最终循环是冗余的),并将其包含在新版本中,可在
github:gist