2012-02-19 27 views
2

我现在正在从网站http://www.net-force.nl/challenges/挑战,我站在一个我无法解决的有趣问题之前。我并没有要求整个结果(因为它会违反规则),但我需要散列函数的编程理论方面的帮助。在Java applet中将字符串散列为整数 - 它是如何工作的?

基本上,它基于带有一个文本字段的Java小程序,用户必须输入正确的密码。当我反编译.class文件时,我得到的一个方法就是这种散列方法。

string s包含输入的密码,应立即给予方法:

private int hash(string s) 
{ 
    int i = 0; 
    for(int j = 0; j < s.length(); j++) 
    i += s.charAt(j); 

    return i; 
} 

的问题是,该方法返回整数为“哈希”,但如何字符转换为整数的所有 ?我有一个想法,也许密码是一个数字,但它不会导致任何地方。另一个想法谈论ASCII,但仍然没有。

感谢您的帮助或提示。

+0

挑战相同的散列值的字符串*“在Java applet中将字符串散列为整数 - 它是如何工作的?“*它可以在一个applet中运行,***在框架,命令行或者servlet中的运行方式完全相同,或者换一种方式,这个问题有*无*可做用小程序代码 – 2012-02-19 18:38:56

回答

4

诀窍是它将每个字符转换为一个整数。 Java中的每个字符(char)是一个UTF-16代码单元。大部分,你可以想象,因为每个字符被映射到一个介于0和65535之间的数字,在一个名为Unicode的方案中。例如,65是'A'的数字,如果您输入的是欧元符号,那么将映射到Unicode U+20AC(8364)。

您的散列函数基本上将字符串中每个字符的数字相加。这是一个非常糟糕的散列(特别是对于相同的字符,无论排序如何,都会得到相同的结果),但希望您能明白。


事情变得棘手,当你需要牢记代理对,在一个单一的Unicode字符实际上是由两个UTF-16代码单元 - 这是用的一个Unicode字符数超过65535.让我们坚持到目前为止的基础:)

+0

好的,说我们有这个字符http://goo.gl/7b2Cg(\ u01C0)。这是否意味着,当我将它转换为整数时,它返回448,就像用十进制表示法写的那样网站? – 2012-02-19 18:36:40

+0

@Mimars:是的,没错。 – 2012-02-19 18:42:33

+0

干得好,行得通!感谢您的帮助,我接受这个答案 – 2012-02-19 18:54:50

0

你提供的散列函数是最简单的散列函数,你可能可以正确的字符串。

它很容易实现,而且计算速度非常快。

虽然它没有很好地分配输入,但这是有问题的。

假设ASCII字符的散列可以取值从0到1016,因为ASCII字符在0-127之间。
即,字符串中的每个字符都被视为ASCII对应的字符(更多高级分析请查看@ John的答案)。

反正你要注意,包含相同字符,但在不同的顺序图与此function.Perhaps这是你的兴趣在你试图攻击(??)

+0

呃,就我所了解的applet而言,目的是我必须找到正确的字符串密码)将它写入GET php请求中(如'pass = something'),并且识别正确密码的方式似乎是将它的散列(如上所述)与另一个散列进行比较。 ,挑战比我想象的要复杂得多,而且 - 一些字符是用Unicode编码的,所以它看到了ms我使用UTF-16表示法。 – 2012-02-19 18:46:21

相关问题