【发布时间】:2016-11-21 18:01:59
【问题描述】:
当前的哈希函数被设计成对哈希有很大的改变,即使只有很小一部分输入被改变。我需要的是一个哈希算法,它的输出变异将与输入变异成正比。例如,我需要类似这样的东西:
Hash("STR1") => 1000
Hash("STR2") => 1001
Hash("STR3") => 1002
等等。 我不擅长算法,但从未听说过这样的实现,尽管我几乎可以肯定应该已经有人提出了这个算法。
我目前的要求是具有大比特率(可能是 512 位?)以避免冲突。
谢谢
更新
我想我应该澄清我的目标,我发现我在解释我需要什么方面做得很糟糕。抱歉,我的母语不是英语,也不是很好的沟通者。
所以基本上我需要这个哈希算法来搜索类似的二进制文件。您可以将其视为防病毒散列算法。它计算文件校验和,但与传统的散列函数不同,即使在恶意软件二进制文件中进行一些小的修改后,它仍然能够检测到它。这几乎是我正在寻找的。
另一个方面是避免碰撞。让我解释一下我的意思。这不是一个矛盾的目标。我希望 Hash("STR1") 产生 1000 和 Hash("STR2") 产生 1001 或 1010 也许,只要该值与先前的哈希值接近,就没有关系。但是 Hash("这是一个非常大的字符串,甚至可能是二进制数据" + 100 个随机字符) 不应该产生接近 1000 的值。我知道它不会总是有效,并且会有一些哈希/哈希范围冲突,但是我想我可以引入另一种哈希算法并验证两者以尽量减少冲突。
那你怎么看?也许有更好的方法来实现我的目标,也许我要求太多了,我不知道。我不太精通密码学、数学或算法。
再次感谢您的时间和精力
【问题讨论】:
-
我希望你知道这在安全方面非常薄弱,但我想我也许能找到一些东西......
-
是的,这不是为了安全目的,而是为了搜索:)。谢谢你的努力劳雷尔:)
-
你还需要“1str”、“2str”、“3str”来散列在一起吗?
-
避免冲突与您保持哈希结果“接近性”的目标不相容。你必须选择一个。
-
Locality-sensitive hashing 可以做到这一点,尽管你最终会遇到更多的冲突。如果您的数据集是已知的并且相当小,您可以创建一个perfect hash function,尽管这不能满足您的目标,即小的输入变化导致小的输出变化。 minimal perfect hash 可能就是您要找的。span>
标签: c++ algorithm hash cryptography antivirus