我正在开发一个搜索系统的后端应用程序.搜索系统将文件复制到临时目录并为其提供随机名称.然后它将临时文件的名称传递给我的应用程序.我的应用程序必须在有限的时间内处理每个文件,否则它将被关闭 - 这是一种看门狗般的安全措施.处理文件可能需要很长时间,所以我需要设计能够处理这种情况的应用程序.如果我的应用程序在下次搜索系统想要索引同一文件时关闭,它可能会给它一个不同的临时名称.
显而易见的解决方案是在搜索系统和后端之间提供一个中间层.它会将请求排入后端并等待结果到达.如果请求在中间层超时 - 没问题,后端将继续工作,只有中间层重新启动,并且当搜索系统稍后重复请求时,它可以从后端检索结果.
问题是如何识别文件.他们的名字随机变化.我打算使用像MD5这样的哈希函数来散列文件内容.我很清楚生日悖论,并使用链接文章中的估计来计算概率.如果我假设我有不超过100 000个文件,那么具有相同MD5(128位)的两个文件的概率大约为1,47x10 -29.
我应该关心这种碰撞概率还是假设相等的散列值意味着相同的文件内容?
我想要创建一些数据对象的32位哈希.由于我不想编写自己的哈希函数并且md5可用,我目前的方法是使用md5哈希中的前32位(即前8个十六进制数字).这可以接受吗?
换句话说,md5哈希的前32位是否与任何其他子串一样"随机"? 或者有什么理由我更喜欢,比方说,最后的32位?或者可能将四个32位子串一起异或?
一些先发制人的澄清:
这是一个组合学问题,需要一些哈希算法的理论.
假设输入可以是30 kB到5 MB大小的任意随机字节序列(我想这会产生很多输入值的组合:))
对于不同的文件,从字节序列计算的MD5哈希的前4个字节(或前n个字节)的概率是多少?
如果不能专门为MD5哈希计算,那么生成均匀分布的m字节哈希值的任何哈希函数在给定输入范围的前n个字节上计算哈希与冲突的概率是多少?