我正在GNAT.SHA1
使用SHA1
在Ada
. 我的代码库很小,所以我想避免将任何库导入到我的编译器未提供的项目中,因此我使用GNAT.SHA1
. 据我所知,检索哈希的唯一“公共”方法是通过Digest
函数以字符串形式。我想获得作为H
该类型成员的160 位块Context
。不幸的是,该Context
记录是私人的。有什么办法可以解决吗?GNAT
或者他们是由Ada 标准库或 Ada 标准库提供的替代方法吗?
问问题
392 次
1 回答
4
我不知道获取 160 位块的任何直接方法,但是您当然可以从十六进制字符串中计算它。
这是我刚刚放在一起的一个例子。"16#"
(当然,通过将和添加到十六进制子字符串来提取 32 位整数"#"
可能不是最优雅的解决方案。
with GNAT.SHA1;
with Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure SHA1_Demo is
C: GNAT.SHA1.Context;
package U32_IO is new Ada.Text_IO.Modular_IO(Interfaces.Unsigned_32);
use U32_IO;
begin
GNAT.SHA1.Update(C, "hello");
declare
SHA1: constant String := GNAT.SHA1.Digest(C);
H: array(0..4) of Interfaces.Unsigned_32;
begin
Put_Line("SHA1(""hello"") = " & GNAT.SHA1.Digest(C));
for I in Integer range 0 .. 4 loop
H(I) := Interfaces.Unsigned_32'Value
("16#" & SHA1(I*8+1 .. I*8+8) & "#");
Put("H(");
Put(I, Width => 0);
Put(") = ");
Put(H(I), Base => 16);
New_Line;
end loop;
end;
end SHA1_Demo;
输出是:
SHA1("hello") = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
H(0) = 16#AAF4C61D#
H(1) = 16#DCC5E8A2#
H(2) = 16#DABEDE0F#
H(3) = 16#3B482CD9#
H(4) = 16#AEA9434D#
于 2012-01-14T12:12:02.513 回答