0

我只是在学习 Python。提前道歉。

我有一个创建字符串哈希的 Delphi 函数。它首先将字符串转换为 ELF Hash(??),然后将其更改为 HEX 数字。

我有第一部分在 Python 中工作

def ELFHash(key):
    hash = 0
    x    = 0
    for i in range(len(key)):
      hash = (hash << 4) + ord(key[i])
      x = hash & 0xF0000000
      if x != 0:
        hash ^= (x >> 24)
      hash &= ~x
    return hash

在 Delphi 中,完成了一个额外的步骤,将其转换为 Hex 值

function BufferToHex(const Buf; BufSize : Cardinal) : string;
var
  I     : LongInt;
begin
  Result := '';
  for I := 0 to BufSize - 1 do
    Result := Result + IntToHex(TByteArray(Buf)[I], 2); 
end;

buf 这里是我得到的精灵哈希,存储在 Delphi longint 中,然后 BufSize 是该 longint 的 Delphi sizeOf(),到目前为止似乎返回 4。

我将如何制作一个类似于 BufferToHex 的 Python 函数来返回等效输出?据我所知,python 类型不同并且不返回相同的字节大小(它似乎返回 16 而不是 4),当我弄乱 ctypes 的东西时,我仍然得到不同的数字。

任何建议表示赞赏。谢谢。

4

1 回答 1

1

该函数所做的只是将二进制转换为十六进制字符串。由于您的输入哈希是 32 位宽,因此您需要的是:

'%08X' % hash

其中 hash 是包含散列值的 int。

因为我猜你在一个小端机器上,这将使十六进制字节反转。像这样修复它:

hashstr = '%08X' % hash
hashstr = "".join(reversed([hashstr[i:i+2] for i in range(0, len(hashstr), 2)]))

把它们放在一起,你就有了:

def ELFHash(key):
    hash, x = 0, 0
    for i in range(len(key)):
        hash = (hash << 4) + ord(key[i])
        x = hash & 0xF0000000
        if x != 0:
            hash ^= (x >> 24)
            hash &= ~x
    hashstr = '%08X' % hash
    return "".join(reversed([hashstr[i:i+2] for i in range(0, len(hashstr), 2)]))
于 2013-03-13T07:31:40.487 回答