.NET框架附带了6种不同的散列算法:
每个功能都有不同的表现; MD5是最快的,RIPEMD是最慢的.
MD5的优势在于它适用于内置的Guid类型; 它是3型UUID的基础.SHA-1哈希是类型5 UUID的基础.这使得它们非常易于识别.
然而,MD5易受碰撞攻击,SHA-1也容易受到攻击,但程度较轻.
我真的很想回答的具体问题是:
MD5不值得信任吗?在正常情况下,当您使用没有恶意意图的MD5算法且没有任何第三方有任何恶意意图时,您会期望任何冲突(意味着两个任意byte []产生相同的哈希)
RIPEMD比SHA1好多少?(如果它更好)它的计算速度要慢5倍,但散列大小与SHA1相同.
散列文件名(或其他短字符串)时获得非恶意冲突的几率是多少?(例如,2个具有相同MD5哈希值的随机文件名)(使用MD5/SHA1/SHA2xx)一般来说,非恶意冲突的几率是多少?
这是我使用的基准:
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
(new Random()).NextBytes(bytes);
return bytes;
}
static void …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个搜索系统的后端应用程序.搜索系统将文件复制到临时目录并为其提供随机名称.然后它将临时文件的名称传递给我的应用程序.我的应用程序必须在有限的时间内处理每个文件,否则它将被关闭 - 这是一种看门狗般的安全措施.处理文件可能需要很长时间,所以我需要设计能够处理这种情况的应用程序.如果我的应用程序在下次搜索系统想要索引同一文件时关闭,它可能会给它一个不同的临时名称.
显而易见的解决方案是在搜索系统和后端之间提供一个中间层.它会将请求排入后端并等待结果到达.如果请求在中间层超时 - 没问题,后端将继续工作,只有中间层重新启动,并且当搜索系统稍后重复请求时,它可以从后端检索结果.
问题是如何识别文件.他们的名字随机变化.我打算使用像MD5这样的哈希函数来散列文件内容.我很清楚生日悖论,并使用链接文章中的估计来计算概率.如果我假设我有不超过100 000个文件,那么具有相同MD5(128位)的两个文件的概率大约为1,47x10 -29.
我应该关心这种碰撞概率还是假设相等的散列值意味着相同的文件内容?
对于一个开源项目,我在文件系统之上编写一个抽象层.
该层允许我将元数据和关系附加到每个文件.
我希望图层能够优雅地处理文件重命名,并在重命名/移动或复制文件时维护元数据.
为此,我需要一种计算文件标识的机制.显而易见的解决方案是为每个文件计算SHA1哈希值,然后根据该哈希值分配元数据.但是......这真的很贵,特别是对于电影来说.
所以,我一直在考虑一种算法虽然不是100%正确,但绝大多数时候都是正确的,并且很便宜.
一种这样的算法可以是使用文件大小和该文件的字节样本来计算散列.
我应该为样本选择哪些字节?如何保持计算的便宜和合理准确?我知道这里有一个权衡,但性能至关重要.用户将能够处理系统出错的情况.
我需要这个算法适用于非常大的文件(1GB +和小文件5K)
编辑
我需要这个算法来处理NTFS和所有SMB共享(基于Linux或基于Windows),我希望它支持将文件从一个位置复制到另一个位置的情况(存在2个物理副本被视为一个标识).我甚至可能会考虑在需要重新标记MP3的情况下(物理文件已更改,因此我可能每个文件类型都有一个身份提供程序).
编辑2
相关问题:确定文件身份的算法(优化)
.net ×1
algorithm ×1
c# ×1
cryptographic-hash-function ×1
cryptography ×1
estimation ×1
filesystems ×1
hash ×1
md5 ×1
probability ×1