我想要一个尽可能短的无碰撞哈希值。我想将它用作文件名的漂亮目录路径。
我目前的解决方案:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
String shortHash(){
byte[] content = "sample".getBytes();
byte[] hex = DigestUtils.md5(content);
String filename = Base64.encodeBase64URLSafeString(hex);
return filename;
}
它产生哈希值 5e8ff9bf55ba3508199d22e984129be6 ,文件名为 Xo_5v1W6NQgZnSLphBKb5g
要在目录树中存储许多文件,我只需将文件名拆分以生成如下文件路径:
<basedir>/Xo/_5/v1W6NQgZnSLphBKb5g
如何生成较短的文件路径?
答案 0 :(得分:1)
我想要一个无碰撞的哈希值
哈希从来都不是无冲突的,但你可以选择一个极不可能发生冲突的哈希算法,正如Jon Skeet所解释的那样。
如何生成较短的文件路径?
你需要解除两个责任。
要处理#2,请按以下步骤操作:
<强>一个)转换强>
<强> b)中解析强>
答案 1 :(得分:-1)
您可以使用Cyclic redundancy check,根据内容的字节生成值。这是我在Java中使用的,它返回一个long:
public static long crc64(byte[] data) {
long crc = 0xffffffffffffffffL;
for (int b : data) {
int b2 = (int) (((crc >> 56) & 0xFF) ^ (b & 0xFF));
crc = (crc << 8) & 0xffffffffffffffffL ^ CRC64_Table[b2];
}
return crc;
}
CRC64_Table
太大了,无法在此处发布,因此我已将其上传到pastebin。
编辑:您也可以使用32位版本,例如:http://introcs.cs.princeton.edu/java/51data/CRC32.java.html