我有以下代码。它是一个散列函数,可将单词转换为散列数:
def myHash (string):
solution = 5
alphabet = 'abcdegjkmnoprstuvwyz'
for carac in string:
solution = solution * 21 + alphabet.find(carac)
return solution
test = 'mytest'
print (myHash(test))
我怎么做相反的方式?从哈希数字中我必须猜出字符串。
答案 0 :(得分:0)
因为这看起来像是一个家庭作业,正如评论中所指出的那样,我将把代码写给你。
由于冲突,您无法反转此哈希函数。即,由于alphabet
并非所有小写都存在,因此str.find
会为 f , h 等字符返回-1
, i , l 和 q 。
因此,如果您收到哈希2204
,则无法知道输入字符串是'af'
,'ah'
,'ai'
,'al'
或'aq'
。
虽然这是一种奇怪的行为而且几乎看似错误,所以让我们讨论一下alphabet = 'abcdefghijklmnopqrstuvwxyz
和solution = solution * 26 + alphabet.find(carac)
的情况。
然后alphabet
中的尾随字符的索引为num % 26
。然后,您可以通过减法和除法获得剩余字符的相应哈希值,并递归获取您的字符串。
答案 1 :(得分:-1)
我想你可以试试这个逻辑:
'''
Given all variable in your original code
'''
1. Define variable(Your String): testF, Hashed ="", myHash(test)
2. loop , stop condition (You figure it out):
testF=alphabet[int(Hashed%(len(alphabet)+1))]+testF
Hashed=int((Hashed-Hashed%(len(alphabet)+1))//(len(alphabet)+1))