我写了哈希计算函数:
var hash = function (string) {
var h = 7;
var i = 0;
var letters = "acdegilmnoprstuw";
while (i < string.length) {
h = (h * 37 + letters.indexOf( string[i++] ));
}
return h;
};
其中string = "agdpeew"
和结果是664804774844
.但现在我不知道如何破译哈希。因此,如果我的输入是664804774844
,答案将agdpeew
。
我可以使用什么算法?
也许我可以从除法664804774844 / 37
开始,但是我如何获得字母索引?
对于短字符串,您可以从以 37 为基数表示数字开始 - 但为什么要这样做?哈希函数的大多数用例不需要你反转函数,许多哈希函数的设计目的是很难或不可能反转函数,除非在输入后评估输入,直到找到一个产生你正在寻找的哈希值。
下面是用 Swift 语言编写的代码,它既加密又解密了哈希值
var letters = "acdegilmnoprstuw";
哈希/加密
func hash(s:String) -> Int{
var h = 7 as Int;
for (var i = 0; i < s.characters.count; i++) {
// Getting the character at index
let s2: Character = s[s.startIndex.advancedBy(i)];
// Getting index of string 'acdegilmnoprstuw'
let l : Int = letters.startIndex.distanceTo(letters.characters.indexOf(s2)!);
h = (h * 37 + l);
}
return h;
}
取消哈希/解密
func unhash(hashValue:Int) -> String{
var h = hashValue
var unhashedString : String = ""
while(h > 37){
unhashedString.append(letters[letters.startIndex.advancedBy(h % 37)])
h = h / 37
}
return String(unhashedString.characters.reverse())
}