【问题标题】:How to change THash.Hash at runtime如何在运行时更改 THash.Hash
【发布时间】:2011-12-13 15:50:24
【问题描述】:

如何将默认的 THash.Hash 算法从默认的 SHA-1 更改为 MD5?

以下不起作用:

var
  StringHash: THash;
begin
  StringHash.Create(nil);
  StringHash.Hash := 'MD5';
end;

编辑:

是的,你很好:我很抱歉没有提到 THash 是新 TurboPower LockBox 3 的一个类。

再次为这个疏忽道歉!

反正肖恩已经给出了我想要的答案。

谢谢大家

【问题讨论】:

  • 什么是 THash ?我找不到任何参考。
  • T 看起来只是类类型,它实际上是 Hash,因为 Delphi 使用 T 作为它的命名约定。您可以导航到“THash”并查看它的真正类继承自 Indy 是否有一个用于此的类..?这是使用stackoverflow.com/questions/58621/…的好链接
  • 当然不行。这将使您的程序崩溃,因为您正在访问不存在的对象的方法和属性。但这与散列无关。 所有 Delphi 对象都是如此。 是你真正要问的吗?如果没有,请发布相关代码,展示您如何成功使用哈希,然后我们可以向您展示如何更改以使用不同的哈希。

标签: delphi lockbox-3


【解决方案1】:

假设您指的是TurboPower Lockbox 的 THash 组件,您可以像这样在运行时选择哈希算法:

function FindHashOfBananaBananaBanana: TBytes;
var
  StringHash: THash;
  Lib: TCrypographicLibrary;
begin
StringHash := THash.Create( nil);
Lib := TCrypographicLibrary( nil);
try
  StringHash.CryptoLibrary := Lib;
  StringHash.HashId := SHA512_ProgId; // Find constants for other algorithms
                                      //  in unit uTPLb_Constants.
  StringHash.HashAnsiString('Banana banana banana');
  SetLength( result, StringHash.HashOutputValue.Size);
  StringHash.HashOutputValue.Read( result[0], StringHash.HashOutputValue.Size);
  StringHash.Burn
finally
  StringHash.Free;
  Lib.Free
  end
end;

【讨论】:

  • StringHash.Burn 方法的目的是什么?
【解决方案2】:

您的示例代码无效。变量类型为 THASH,变量名称为 STRINGHASH。当你构造一个类的实例时,格式通常是:

var
  StringHash:THash;
begin
  StringHash := THash.Create();
  try
    DoSomethingWithStringHash;
  finally
    StringHash.Free()
  end
end;

修正您的示例并返回更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多