0

我最近开始用java编程我做了这个代码: https ://github.com/mouuff/JavaMD5cracker

代码有效,但我收到了这个令人毛骨悚然的警告:

C:\Users\mou\Desktop\JavaMD5cracker-master>javac icrackmd5.java
Note: .\brute.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

听起来编译器发现这一行 (brute.java : l 26) 不安全或者我不知道......

if (tries > (int)pows.get(lenght-1))

有人可以帮我吗?

4

3 回答 3

2

这是因为您在brute.java中的哈希表声明

Hashtable pows = new Hashtable();

当编译器执行此行时

if (tries > (int)pows.get(lenght-1))

它不知道pows中元素的类型是什么。

使用泛型更改您的哈希表声明

Hashtable<Integer, Integer> pows = new Hashtable<Integer,Integer>();
于 2012-11-07T14:10:11.767 回答
1

只是您正在int另一个对象中进行强制转换操作。这是一个未经检查的操作,因为编译器无法检查您返回的内容是否pows.get(length-1)真的可以转换为int.

如果您信任(我的意思是真正信任)您的代码并且知道int可以始终进行强制转换,那么您可以这样做,这只是编译器警告。

同时,看一下Math对象。也许有一种更简单、更安全的方法来完成你想要完成的事情。

编辑

改变这个:

Hashtable pows = new Hashtable();

到:

Hashtable<Integer,Integer> pows = new Hashtable<Integer,Integer>();

将摆脱您的编译器注释。

于 2012-11-07T14:05:32.763 回答
1

该类brute包含以下内容:

Hashtable pows = new Hashtable();

它使用原始类型Hashtable。这里应该使用泛型。此外,它应该使用HashMap而不是旧的集合类Hashtable

Map<Integer, Integer> = new HashMap<Integer, Integer>();

那么演员表将是不必要的:

if (tries > pows.get(lenght-1)){

(请注意,“长度”拼写错误,应该是“长度”)。

除此之外,成员变量应该是private,并且代码不符合世界上大多数人使用的事实上的编码标准(类名应该以大写字符开头,变量名不应包含下划线)。

于 2012-11-07T14:12:43.077 回答