新的hashcode,需要帮助理解代码片段

时间:2013-10-01 03:05:06

标签: java

我有以下代码片段,需要一些帮助来理解它的一些部分。

String fileName = UUID.randomUUID().toString();

int hashcode = fileName.hashCode();

//I'm not sure why we are creating a mask with an int of 255
int mask = 255;

//Wny are we adding 255 to the hashcode?
int firstDir = hashcode & mask;

//What does it mean to have (hashcode >> 8) & mask? If I were to build a third
// tier would I use (hashcode >> 16) $ mask?
int secondDir = (hashcode >> 8) & mask;

StringBuilder sb = new StringBuilder(File.separator);

//I noticed when using this %02 it truncates the directory to 2 chars, does this 
//just convert 3 digits to alpha numeric representing the same three digits?
sb.append(String.format("%02x", firstDir));

sb.append(File.separator);
sb.append(String.format("%02x", secondDir));
sb.append(File.separator);

最后,如果我想从两个目录生成一个文件名,我是否只需要设置另一个没有File.separator的字符串生成器,或者在没有文件分隔符的情况下首先构建字符串会更高效,然后拆分字符串?

2 个答案:

答案 0 :(得分:1)

那段代码很傻。

如果要创建从随机UUID派生的两个随机分布的两位十六进制代码,您只需使用UUID本身的前四个十六进制数字。

String fileName = UUID.randomUUID().toString();
String firstDir = fileName.substring(0,2);
String secondDir = fileName.substring(2,4);

随机UUID是加密强大的随机二进制字符串(a few fixed digits除外,表示这是类型4 UUID)。任何散列和位移或屏蔽都会降低随机性。

答案 1 :(得分:1)

255是0FF hex,0 1111 1111 binary。

与'and'运算符(“&”)一起使用的掩码用于隔离掩码的值的位 - 一个与上述掩码相关的整数产生一个具有相同最低值的整数 - 将8位作为原始整数。

通过>>的整数8移位到右8位;在使用相同的掩码之后,使用相同的掩码隔离这些8位,这些位从原始整数中的下一个高位8位开始。

除非你能证明几微秒会产生影响,否则不要担心效率。担心让你的代码足够可理解,以至于有人不必发布到stackoverflow来理解它。