生成并解决短文件路径

时间:2015-09-02 22:07:55

标签: java file hash path

我想要一个尽可能短的无碰撞哈希值。我想将它用作文件名的漂亮目录路径。

  • 我想构建一个路径树长度几乎相等的目录树 到其中的任何文件。
  • 文件包含二进制内容。
  • 两个内容相同的文件应该生成相同的文件路径(I 认为这是散列应该提供的内容。)
  • 哈希长度应该是最小的。
  • 哈希计算时间不是哈希值以来的首要任务 每个文件都要进行一次计算。

我目前的解决方案:

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

如何生成较短的文件路径?

2 个答案:

答案 0 :(得分:1)

  

我想要一个无碰撞的哈希值

哈希从来都不是无冲突的,但你可以选择一个极不可能发生冲突的哈希算法,正如Jon Skeet所解释的那样。

  

如何生成较短的文件路径?

你需要解除两个责任。

  1. 文件的哈希值为您提供快速碰撞检测。
  2. 生成短文件路径。请查看alphabet conversion theoryJava UrlShortener实施情况。
  3. 要处理#2,请按以下步骤操作:

    <强>一个)转换

    1. 在数据库中保存真实文件路径
    2. 您将获得该
    3. 的唯一行ID
    4. 使用encode()
    5. 将行ID转换为短字符串
    6. 使用短字符串作为短文件路径
    7. <强> b)中解析

      1. 使用decode()
      2. 将短文件路径解码为整数ID
      3. 在数据库中查找给定ID的实际文件路径

答案 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