我试图找到两个消息之间的冲突,这将导致相同的CRC哈希.考虑到我使用CRC32,有什么方法可以缩短我在进行暴力攻击时必须尝试的消息列表?
任何带有相关提示的网站链接都会有所帮助.我已经有了一个强力算法,它会做到这一点,但它只是增加整数,看它是否会匹配其他哈希值.
我想从字符串生成int并能够生成它.类似哈希函数但是双向函数.我想在我的应用程序中使用int作为ID,但希望能够在记录或调试时将其转换回来.
喜欢:
int id = IDProvider::getHash("NameOfMyObject");
object * a = createObject(id);
...
if(error)
{
LOG(IDProvider::getOriginalString(a->getId()), "some message");
}
Run Code Online (Sandbox Code Playgroud)
我听说过略微修改的CRC32快速且100%可逆,但我找不到它,我自己也无法写.
任何提示我应该使用什么?谢谢!
编辑 我刚刚创建了源代码我有完整的CRC32来自:
Jason Gregory:游戏引擎架构
报价:
"与任何哈希系统一样,冲突是可能的(即,两个不同的字符串可能最终使用相同的哈希码).但是,通过合适的哈希函数,我们可以保证所有合理的输入字符串都不会发生冲突我们可能会在我们的游戏中使用.毕竟,一个32位的哈希代码表示超过40亿个可能的值.所以如果我们的哈希函数在这个非常大的范围内很好地分配字符串,我们就不太可能发生冲突. Naughty Dog,我们使用了CRC-32算法的变体来对我们的字符串进行哈希处理,并且在Uncharted:Drake's Fortune的两年多的开发中我们没有遇到过一次冲突.
我将从我自己的类中定义的一些对象保存到File.(保存流数据).
这一切都很好,但我希望能够在File中存储该文件的CRC校验和.
然后,每当我的应用程序尝试打开文件时,它都可以读取内部存储的CRC值.
然后检查实际文件,如果文件的CRC与内部存储的CRC值匹配,我可以正常处理文件,否则显示错误消息,说文件无效.
我需要一些关于如何做到这一点的建议,我想我可以这样做:
问题是,只要在文件中更改了单个数据字节,就会导致CRC校验和完全不同 - 正如预期的那样.
我找到了一个代码来反转CRC32,但我不知道它是如何工作的,因为我在编程方面不是那么好,我刚开始.我只想比较2个文件,旧的和新的,然后在新的修复中CRC32在文件的末尾添加4个字节,因此2个文件将具有相同的CRC32.这是代码,在C#中:
public class Crc32
{
public const uint poly = 0xedb88320;
public const uint startxor = 0xffffffff;
static uint[] table = null;
static uint[] revtable = null;
public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc)
{
if (fixpos + 4 > length) return;
uint crc = startxor;
for (int i = 0; i < fixpos; i++) {
crc = (crc >> 8) ^ table[(crc ^ bytes[i]) & 0xff];
}
Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
crc = wantcrc ^ …Run Code Online (Sandbox Code Playgroud)