从GNAT.SHA1获取SHA1块

时间:2012-01-14 06:37:19

标签: sha1 ada gnat

我正在使用GNAT.SHA1SHA1中创建字符串的Ada哈希值。我的代码库很小,所以我想避免将任何库导入到我的编译器未提供的项目中,因此我使用的是GNAT.SHA1。据我所知,检索哈希的唯一“公共”方法是通过Digest函数以字符串形式。我想改为获得H Context类型的Context成员的160位块。不幸的是,GNAT记录是私有的。有什么办法可以搞定吗?或者他们是{{1}}或Ada标准库提供的另一种方法吗?

1 个答案:

答案 0 :(得分: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#