33 lines
858 B
C#
33 lines
858 B
C#
using Vanguard.Rules.Engine;
|
||
|
||
namespace Vanguard.Rules.Replay;
|
||
|
||
/// <summary>FNV-1a по тексту событий. Не криптография, а быстрая проверка расхождений.</summary>
|
||
public static class EventHasher
|
||
{
|
||
private const ulong Offset = 14695981039346656037UL;
|
||
private const ulong Prime = 1099511628211UL;
|
||
|
||
public static string Hash(IEnumerable<GameEvent> events)
|
||
{
|
||
unchecked
|
||
{
|
||
var hash = Offset;
|
||
|
||
foreach (var gameEvent in events)
|
||
{
|
||
foreach (var ch in gameEvent.ToString() ?? string.Empty)
|
||
{
|
||
hash ^= ch;
|
||
hash *= Prime;
|
||
}
|
||
|
||
hash ^= '\n';
|
||
hash *= Prime;
|
||
}
|
||
|
||
return hash.ToString("x16");
|
||
}
|
||
}
|
||
}
|