added WangHash for DtNodePool

This commit is contained in:
ikpil 2024-02-04 13:24:09 +09:00 committed by Ikpil
parent 94ed3d646c
commit 2d3ca5b321
5 changed files with 64 additions and 5 deletions

View File

@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Added ### Added
- Added DtNodePool tests - Added DtNodePool tests
- Added WangHash() for DtNodePool
- Added avg, min, max, sampling updated times in CrowdAgentProfilingTool - Added avg, min, max, sampling updated times in CrowdAgentProfilingTool
### Fixed ### Fixed

View File

@ -1,10 +1,26 @@
namespace DotRecast.Core using System.Runtime.CompilerServices;
namespace DotRecast.Core
{ {
public static class RcHashCodes public static class RcHashCodes
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CombineHashCodes(int h1, int h2) public static int CombineHashCodes(int h1, int h2)
{ {
return (((h1 << 5) + h1) ^ h2); return (((h1 << 5) + h1) ^ h2);
} }
// From Thomas Wang, https://gist.github.com/badboy/6267743
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static uint WangHash(uint a)
{
a = (~a) + (a << 18); // a = (a << 18) - a - 1;
a = a ^ (a >> 31);
a = a * 21; // a = (a + (a << 2)) + (a << 4);
a = a ^ (a >> 11);
a = a + (a << 6);
a = a ^ (a >> 22);
return (uint)a;
}
} }
} }

View File

@ -24,11 +24,13 @@ namespace DotRecast.Detour
{ {
public class DtNodePool public class DtNodePool
{ {
private readonly Dictionary<long, List<DtNode>> m_map = new Dictionary<long, List<DtNode>>(); private readonly Dictionary<long, List<DtNode>> m_map;
private readonly List<DtNode> m_nodes = new List<DtNode>(); private readonly List<DtNode> m_nodes;
public DtNodePool() public DtNodePool()
{ {
m_map = new Dictionary<long, List<DtNode>>();
m_nodes = new List<DtNode>();
} }
public void Clear() public void Clear()
@ -112,4 +114,4 @@ namespace DotRecast.Detour
return m_map; return m_map;
} }
} }
} }

View File

@ -0,0 +1,40 @@
using NUnit.Framework;
namespace DotRecast.Core.Test;
public class RcHashCodesTest
{
[Test]
public void TestCombineHashCodes()
{
Assert.That(RcHashCodes.CombineHashCodes(0, 0), Is.EqualTo(0));
Assert.That(RcHashCodes.CombineHashCodes(int.MaxValue, int.MaxValue), Is.EqualTo(32));
Assert.That(RcHashCodes.CombineHashCodes(int.MaxValue, int.MinValue), Is.EqualTo(-33));
Assert.That(RcHashCodes.CombineHashCodes(int.MinValue, int.MinValue), Is.EqualTo(0));
Assert.That(RcHashCodes.CombineHashCodes(int.MinValue, int.MaxValue), Is.EqualTo(-1));
Assert.That(RcHashCodes.CombineHashCodes(int.MaxValue / 2, int.MaxValue / 2), Is.EqualTo(32));
}
[Test]
public void TestIntHash()
{
Assert.That(RcHashCodes.WangHash(0), Is.EqualTo(4158654902));
Assert.That(RcHashCodes.WangHash(1), Is.EqualTo(357654460));
Assert.That(RcHashCodes.WangHash(2), Is.EqualTo(715307540));
Assert.That(RcHashCodes.WangHash(3), Is.EqualTo(1072960876));
Assert.That(RcHashCodes.WangHash(4), Is.EqualTo(1430614333));
Assert.That(RcHashCodes.WangHash(5), Is.EqualTo(1788267159));
Assert.That(RcHashCodes.WangHash(6), Is.EqualTo(2145921005));
Assert.That(RcHashCodes.WangHash(7), Is.EqualTo(2503556531));
Assert.That(RcHashCodes.WangHash(8), Is.EqualTo(2861226262));
Assert.That(RcHashCodes.WangHash(9), Is.EqualTo(3218863982));
Assert.That(RcHashCodes.WangHash(10), Is.EqualTo(3576533554));
Assert.That(RcHashCodes.WangHash(11), Is.EqualTo(3934169234));
//
Assert.That(RcHashCodes.WangHash(int.MaxValue), Is.EqualTo(1755403298));
Assert.That(RcHashCodes.WangHash(uint.MaxValue), Is.EqualTo(3971045735));
}
}

View File

@ -5,7 +5,7 @@ using NUnit.Framework;
namespace DotRecast.Core.Test; namespace DotRecast.Core.Test;
public class Vector3Tests public class Vector3Test
{ {
[Test] [Test]
[Repeat(100000)] [Repeat(100000)]