Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
我正在尝试破解Java中的哈希算法:

    public static int encode(String file) {
            int hash = 0;
            file = file.toUpperCase();

            for(int i = 0; i < file.length(); i++) {
                    hash = (hash * 61 + file.charAt(i)) - 32;
            }
            return hash;
    }

这是我的尝试:
public static String decode(int hash) {
            long realHash = (hash < 0 ? Integer.MAX_VALUE + Math.abs(hash) : hash);
            ByteBuffer buffer = ByteBuffer.allocate(50);

            while (realHash > 0) {
                    buffer.put((byte) ((realHash % 61) + 32));
                    realHash = (realHash - 32) / 61;
            }
            buffer.flip();
            return new String(buffer.array()).trim();
    }

我的解决方案似乎有严重的数据丢失,我认为由于整数溢出,我无法完全取消长文本数据的刷新。有什么建议吗?

最佳答案

问题不在于整数溢出这就像开车越过熔岩,让你的车爆炸,然后得出结论说你没有买合适的汽油。
真正的问题是你不能“破解”散列算法。有一个重要的原因:
信息论
信息论中有一个术语叫做Shannon entropy。(公平警告:这篇文章不容易理解)快速版本是,对任何给定的信息块进行编码都需要最少的比特数。
This site有一个计算器,声称可以确定对给定文本进行无损编码所需的熵量(即最小比特数)。我给它提供了一大块artisanal filler text
麦金斯饲料苦味豆腐,韦斯安德森食品卡车工艺啤酒
苹果手机。单源咖啡香酯独角鲸
做空嘉信基金艺术品派对倾盆大雨你可能还没听说
它们的苦味。宝丽来工艺啤酒智能,乙烯基马法
布鲁克林乌玛。
假设int在您的系统上是32位,那么您只有32位的空间来编码任何给定的文件。但上面这段代码——与我可能使用的代码(如《战争与和平》(War and Peace)或《美国法典》(the US Code))相比不算太长——如果你想重建文本,至少需要1472位才能进行编码。
(commentortemplatetypedef指向Kolmogorov complexityanother good explanation of that concept),这是一种更好的表示字符串信息内容和破解散列的方法。)
所以从理论上讲(撇开欺骗不谈,比如有一个预先填充的压缩字典),不可能从32位int重建那些(简单的手工制作的本地源代码)句子。不幸的是,这是宇宙的基本定律不会发生的。
实例,来自代码
Another commentor提到了Pigeonhole Principle——一个简单的想法,如果你有N个插槽(在本例中是2^32),那么如果不在同一个插槽中放置两个或更多的东西,就不能在其中放置N个以上的东西。
让我们使用哈希函数:

public static int encode(String file) {
        int hash = 0;
        file = file.toUpperCase();

        for(int i = 0; i < file.length(); i++) {
                hash = (hash * 61 + file.charAt(i)) - 32;
        }
        return hash;
}

具体来说,这一行:
file = file.toUpperCase();

我想散列两个文件:
mary had a little lamb

Mary Had A Little Lamb

它们的散列值是多少想想看。
(旁注:尽管这么说,你的智力还是过剩了:)Modular arithmetic如果你想做那样的事情,那你就是你的朋友。)

关于java - 破解哈希算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19484292/

10-10 06:44