【问题标题】:Reduce a large string to a smaller string using hashing or encoding使用散列或编码将大字符串缩减为较小的字符串
【发布时间】:2013-08-02 19:38:43
【问题描述】:

可能重复How to reduce a bigger string in smaller string in C++? Probably by hashing?

我尝试在 java 中为 bmp 文件创建自己的校验和算法。因此,对于 54 字节(432 位)的标头,生成的校验和为 378 位长。

如何将其缩减为更小的数据集?关于如何实现我自己的哈希算法的任何建议? (条件之一是不使用现有算法)。

我使用了一个非常简单的哈希函数。

public static String hash_function(String bmpBytes) {

    String hash = "";
    int left_shift = Integer.parseInt(bmpBytes);
    int right_shift = Integer.parseInt(bmpBytes);
    left_shift = left_shift << 2;
    right_shift = right_shift >> 2;
    int xor = left_shift ^ right_shift;
    hash += Integer.toString(xor);
    return hash;
}

可能的答案:

我找到了一种通过生成“n”个随机二进制位来缩短字符串的方法,其中 n &lt; sizeOf(hash) 然后做一个hash % n-bits

如果这是一个有效的答案,请告诉我,我会将问题标记为已回答。

【问题讨论】:

  • 你需要它做什么?短散列是使用 0 位。您需要的最少位数是多少?
  • 我已经更新了我的帖子以包含我的哈希函数。请检查。
  • 您必须更精确地满足您的要求,算法return "" 满足您所说的:字符串被缩减为更小的字符串。算法是否应该是安全的、可逆的等。
  • 但不清楚你为什么写这个。你能说出你的要求是什么吗?顺便说一句,将哈希存储为文本是不寻常的,因为它通常是二进制值。
  • 文本实际上是为BMP文件生成的校验和。我的目标是获取 BMP 文件的 54 字节标头并将其与校验和进行匹配,以查看它是否已损坏。

标签: java hash


【解决方案1】:

这里有一些简单的东西。也许这可以激励你做更好的事情。

public static String encode(String header) {
    char[] code = new char[32];
    for(int i = 0; i < header.length(); i++) {
        code[i % code.length] = (char)((int)code[i % code.length] ^ (int)header.charAt(i));
    }
    return new String(code);
}

【讨论】:

  • 这真的很有趣!谢谢!我会尝试修改这个。
  • 如何使用该编码字符串取回原始字符串?
  • @MuneebNasir 通常使用散列这是不可能的,散列的原因之一是安全性,您可以在密码上使用它进行单向转换,尽管多个字符串映射到相同的输出,但您永远不能确保原始输入
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多