如何在Python3中使用哈希函数将任意字符串转换为固定长度的字母数字符号序列?



我有大量不同语言的句子(法语、乌克兰语、英语等)。对于每个句子,我想生成一个音频文件,其中给定的句子由文本到语音的程序发音。现在我需要决定如何命名这些音频文件(每个句子一个文件)。我认为如果我能从句子中推断出文件名,那将是很优雅的。换句话说,如果我看到这个句子,我应该能够计算机(推断/推导)说出这个句子的音频文件的名称。

我想我可以用一个哈希函数。我将对表示句子的字符串应用散列函数,结果,我将得到一个字符串(散列),我可以将其用作文件名。

为什么不用句子本身作为名字呢?因为句子可能很大,而我不想要非常大的文件名。此外,我不希望在文件名中有空格和其他标点符号(以及奇怪的字母符号)。最后,我希望哈希总是有相同的长度,这看起来很好。

现在是我的问题:我如何将任意unicode字符串转换为Python3中输入字符串的哈希的字母数字符号序列?

我也想知道对于不同的句子是否有得到相同哈希值的危险。

补充道:

我刚刚意识到,通过将hash函数应用于同一字符串,我可以为不同的会话获得不同的结果。这显然是我想要避免的。

当然。使用加密散列函数,如SHA-256;它们在hashlib中有。(正如您所注意到的,由于PYTHONHASHSEED,hash在会话之间不稳定,在Python版本和解释器之间也不一定稳定。)

我在这里也应用了一些规范化,但这可能是你想要的,也可能不是。

import hashlib

def get_filename(sentence: str) -> str:
# assuming leading/trailing whitespace doesn't matter, nor does case
sentence_norm = sentence.lower().strip()  
return hashlib.sha256(sentence_norm.encode("utf-8")).hexdigest()
>>> get_filename("Hello, mon ami!")
'c13c197526d17532bd6d9bf3c2ad34486ccb2fcdeadaf7b71c3c67c0f048ecb9'
>>> get_filename("hello, mon ami!   ")
'c13c197526d17532bd6d9bf3c2ad34486ccb2fcdeadaf7b71c3c67c0f048ecb9'
>>>

我也想知道对于不同的句子是否有得到相同哈希值的危险。

不,除非SHA-256被打破,否则我们都有麻烦了。

最新更新