2013-10-01 106 views
0

我有下面的代码片段,需要一些帮助理解它的一些片段。新来散列码,需要帮助理解代码片段

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); 

最后,如果我想从两个目录生成一个文件名,我会只安装另一个字符串生成器,无文件分割符,或者它会更有效地先建字符串没有文件分隔符,然后分割字符串?

+1

首先去看看'&'和'>>'运算符。 –

+0

@SotiriosDelimanolis还有关于十六进制和格式化字符串! –

+0

'&'(AND)是一个[按位运算符](http://en.wikipedia.org/wiki/Bitwise_operation) - 在尝试使用它们之前,先准备一些阅读和理解**。 –

回答

1

255是0FF十六进制,0 1111 1111二进制。

与“和”运算符(“&”)一起使用的掩码用于隔离掩码结束的值的位 - 用上述掩码结尾的整数导致具有相同最低的整数8位作为原始整数。

整数通过>> 8被移位到右边的8位;然后用相同的掩码隔开这8位,这些8位开始是原始整数中下一个高位8位。

不要担心效率,除非你能证明几微秒会产生变化。担心让你的代码足够容易理解,以至于有人不必通过发布到stackoverflow来理解它。

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)。任何哈希和位移或掩盖只会降低随机性。

+0

使用您建议的逻辑,这是否仍然允许每个目录最多1000个项目? –

+1

对于哈希目录层,这两种情况都是256。 00至FF。例如,“12/34 /'下的文件数量可能是无限的(但不太可能达到非常高的数量)。与您的原始代码相同。 – Thilo

+0

我想我会使用您的解决方案,它似乎比我在网上找到的上述代码更简单。我还有最后一个问题,我只做了一个测试,用一百万个文件测试文件分发,并且从来没有一次使用类似的方法在同一个目录中看到两个文件。 \ 9D \ 62 \ f35a.jpg。有没有机会将天平与许多目录放在一起导致性能问题? –