我有以下代码片段,需要一些帮助来理解它的一些部分。
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的字符串生成器,或者在没有文件分隔符的情况下首先构建字符串会更高效,然后拆分字符串?
答案 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来理解它。