diff --git a/Switch_Toolbox_Library/Security/Cryptography/mmh3.cs b/Switch_Toolbox_Library/Security/Cryptography/mmh3.cs
new file mode 100644
index 00000000..8fdfa522
--- /dev/null
+++ b/Switch_Toolbox_Library/Security/Cryptography/mmh3.cs
@@ -0,0 +1,89 @@
+using System.IO;
+using System.Text;
+
+namespace Toolbox.Library.Security.Cryptography
+{
+ public static class MurMurHash3
+ {
+ private const uint Seed = 0;
+
+ public static uint Hash(string s)
+ {
+ var ss = new MemoryStream(Encoding.UTF8.GetBytes(s));
+ return Hash(ss);
+ }
+
+ public static uint Hash(Stream stream)
+ {
+ const uint c1 = 0xcc9e2d51;
+ const uint c2 = 0x1b873593;
+
+ var h1 = Seed;
+ uint streamLength = 0;
+
+ using (var reader = new BinaryReader(stream))
+ {
+ var chunk = reader.ReadBytes(4);
+ while (chunk.Length > 0)
+ {
+ streamLength += (uint)chunk.Length;
+ uint k1;
+ switch (chunk.Length)
+ {
+ case 4:
+ k1 = (uint)(chunk[0] | chunk[1] << 8 | chunk[2] << 16 | chunk[3] << 24);
+ k1 *= c1;
+ k1 = Rot(k1, 15);
+ k1 *= c2;
+ h1 ^= k1;
+ h1 = Rot(h1, 13);
+ h1 = h1 * 5 + 0xe6546b64;
+ break;
+ case 3:
+ k1 = (uint) (chunk[0] | chunk[1] << 8 | chunk[2] << 16);
+ k1 *= c1;
+ k1 = Rot(k1, 15);
+ k1 *= c2;
+ h1 ^= k1;
+ break;
+ case 2:
+ k1 = (uint) (chunk[0] | chunk[1] << 8);
+ k1 *= c1;
+ k1 = Rot(k1, 15);
+ k1 *= c2;
+ h1 ^= k1;
+ break;
+ case 1:
+ k1 = (chunk[0]);
+ k1 *= c1;
+ k1 = Rot(k1, 15);
+ k1 *= c2;
+ h1 ^= k1;
+ break;
+ }
+ chunk = reader.ReadBytes(4);
+ }
+ }
+
+ h1 ^= streamLength;
+ h1 = Mix(h1);
+
+ return h1;
+ }
+
+ private static uint Rot(uint x, byte r)
+ {
+ return (x << r) | (x >> (32 - r));
+ }
+
+ private static uint Mix(uint h)
+ {
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+ return h;
+ }
+ }
+}
diff --git a/Switch_Toolbox_Library/Toolbox_Library.csproj b/Switch_Toolbox_Library/Toolbox_Library.csproj
index 67abc8be..f3c6d3d8 100644
--- a/Switch_Toolbox_Library/Toolbox_Library.csproj
+++ b/Switch_Toolbox_Library/Toolbox_Library.csproj
@@ -450,6 +450,7 @@
+
diff --git a/Toolbox/GUI/HashCalculatorForm.cs b/Toolbox/GUI/HashCalculatorForm.cs
index 18de22b5..67ff12b1 100644
--- a/Toolbox/GUI/HashCalculatorForm.cs
+++ b/Toolbox/GUI/HashCalculatorForm.cs
@@ -9,6 +9,7 @@ using System.Threading;
using System.Windows.Forms;
using Toolbox.Library.Forms;
using Toolbox.Library;
+using Toolbox.Library.Security.Cryptography;
namespace Toolbox
{
@@ -27,6 +28,7 @@ namespace Toolbox
hashTypeCB.Items.Add("CRC32");
hashTypeCB.Items.Add("BCSV");
hashTypeCB.Items.Add("SARC");
+ hashTypeCB.Items.Add("MMH3");
hashTypeCB.SelectedIndex = 0;
@@ -71,6 +73,8 @@ namespace Toolbox
return stringToHash(text);
else if (type == "SARC")
return NameHash(text);
+ else if (type == "MMH3")
+ return MurMurHash3.Hash(text);
return 0;
}