60 lines
1.7 KiB
C#
60 lines
1.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace OpenSubtitlesHandler
|
|
{
|
|
public class MovieHasher
|
|
{
|
|
public static byte[] ComputeMovieHash(string filename)
|
|
{
|
|
byte[] result;
|
|
using (Stream input = File.OpenRead(filename))
|
|
{
|
|
result = ComputeMovieHash(input);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static byte[] ComputeMovieHash(Stream input)
|
|
{
|
|
long lhash, streamsize;
|
|
streamsize = input.Length;
|
|
lhash = streamsize;
|
|
|
|
long i = 0;
|
|
byte[] buffer = new byte[sizeof(long)];
|
|
while (i < 65536 / sizeof(long) && (input.Read(buffer, 0, sizeof(long)) > 0))
|
|
{
|
|
i++;
|
|
lhash += BitConverter.ToInt64(buffer, 0);
|
|
}
|
|
|
|
input.Position = Math.Max(0, streamsize - 65536);
|
|
i = 0;
|
|
while (i < 65536 / sizeof(long) && (input.Read(buffer, 0, sizeof(long)) > 0))
|
|
{
|
|
i++;
|
|
lhash += BitConverter.ToInt64(buffer, 0);
|
|
}
|
|
input.Close();
|
|
byte[] result = BitConverter.GetBytes(lhash);
|
|
Array.Reverse(result);
|
|
return result;
|
|
}
|
|
|
|
public static string ToHexadecimal(byte[] bytes)
|
|
{
|
|
StringBuilder hexBuilder = new StringBuilder();
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
hexBuilder.Append(bytes[i].ToString("x2"));
|
|
}
|
|
return hexBuilder.ToString();
|
|
}
|
|
}
|
|
}
|