Испытательные векторы MurmurHash3

Я пытаюсь держать a в строевой стойке Внедрение C# MurmurHash3 к VB.Net.

Это бежит..., но кто-то может предоставить мне некоторые известные Испытательные Векторы, чтобы проверить правильность?

  • Известный текст последовательности
  • стоимость Семени
  • Результат MurmurHash3

Заранее спасибо.

Edit : I'm limiting the implementation to only the 32-bit MurmurHash3, but if you can also provide vectors for the 64-bit implementation, would also be good.

5
nl ja de
@KaiSellgren я утвердил x86 32bit Тесты против моего собственного внедрения. Было бы полезно, если бы тест JavaScript также проверил, что последовательности JavaScript - закодированный utf-8 (например, " ππππππππ "), а также что это поддерживает включенный, аннулирует (например, " \0\0\0\0" )
добавлено автор Ian Boyd, источник
Я написал свое собственное внедрение и заметил, что это те же самые ценности это I' m получение: github.com/karanlyons/murmurHash3.js/blob/master/tests.html
добавлено автор Kai Sellgren, источник
@IanBoyd, для какой it' s ценность, here' s мое внедрение в Ржавчине с несколькими тестами единицы в основании: github.com/kaisellgren/comp_sci.rs/blob/master/src/algorithm‌ ​ s/…
добавлено автор Kai Sellgren, источник

3 ответы

Я наконец нашел время для создания внедрения MurMur3, и мне удалось перевести тестовый код SMHasher. Мое внедрение дает тот же самый результат как тест SMHasher. Это означает, что я могу наконец дать некоторым полезным, и предполагаемый быть правильным, испытательные векторы.

Это для Murmur3_x86_32 только

| Input        | Seed       | Expected   |
|--------------|------------|------------|
| (no bytes)   | 0          | 0          | with zero data and zero seed, everything becomes zero
| (no bytes)   | 1          | 0x514E28B7 | ignores nearly all the math
| (no bytes)   | 0xffffffff | 0x81F16F39 | make sure your seed uses unsigned 32-bit math
| FF FF FF FF  | 0          | 0x76293B50 | make sure 4-byte chunks use unsigned math
| 21 43 65 87  | 0          | 0xF55B516B | Endian order. UInt32 should end up as 0x87654321
| 21 43 65 87  | 0x5082EDEE | 0x2362F9DE | Special seed value eliminates initial key with xor
| 21 43 65     | 0          | 0x7E4A8634 | Only three bytes. Should end up as 0x654321
| 21 43        | 0          | 0xA0F7B07A | Only two bytes. Should end up as 0x4321
| 21           | 0          | 0x72661CF4 | Only one byte. Should end up as 0x21
| 00 00 00 00  | 0          | 0x2362F9DE | Make sure compiler doesn't see zero and convert to null
| 00 00 00     | 0          | 0x85F0B427 | 
| 00 00        | 0          | 0x30F4C306 |
| 00           | 0          | 0x514E28B7 |

Для тех из вас, кто будет держать в строевой стойке на язык, у которого нет фактических множеств, у меня также есть некоторые основанные на последовательности тесты. Для этих тестов:

  • все последовательности, как предполагается, является UTF-8, закодированным
  • и не включает пустого терминатора

Я оставлю их в кодовой форме:

TestString("", 0, 0); //empty string with zero seed should give zero
TestString("", 1, 0x514E28B7);
TestString("", 0xffffffff, 0x81F16F39); //make sure seed value is handled unsigned
TestString("\0\0\0\0", 0, 0x2362F9DE); //make sure we handle embedded nulls


TestString("aaaa", 0x9747b28c, 0x5A97808A); //one full chunk
TestString("aaa", 0x9747b28c, 0x283E0130); //three characters
TestString("aa", 0x9747b28c, 0x5D211726); //two characters
TestString("a", 0x9747b28c, 0x7FA09EA6); //one character

//Endian order within the chunks
TestString("abcd", 0x9747b28c, 0xF0478627); //one full chunk
TestString("abc", 0x9747b28c, 0xC84A62DD);
TestString("ab", 0x9747b28c, 0x74875592);
TestString("a", 0x9747b28c, 0x7FA09EA6);

TestString("Hello, world!", 0x9747b28c, 0x24884CBA);

//Make sure you handle UTF-8 high characters. A bcrypt implementation messed this up
TestString("ππππππππ", 0x9747b28c, 0xD58063C1); //U+03C0: Greek Small Letter Pi

//String of 256 characters.
//Make sure you don't store string lengths in a char, and overflow at 255 bytes (as OpenBSD's canonical BCrypt implementation did)
TestString(StringOfChar("a", 256), 0x9747b28c, 0x37405BDC);

Я отправлю всего два из 11 испытательных векторов SHA-2, которые я преобразовал в Murmur3.

TestString("abc", 0, 0xB3DD93FA);
TestString("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 0, 0xEE925B90);

И наконец, большой:

  • Key: "The quick brown fox jumps over the lazy dog"
  • Seed: 0x9747b28c
  • Hash: 0x2FA826CD

Если кто-либо еще может подтвердить какой-либо/весь из этих векторов от их внедрений.

И, снова, эти испытательные векторы прибывают из внедрения, которое проходит итеративный тест петли SMHasher 256 от KeySetTest.cpp - VerificationTest (...).

Эти тесты прибыли из моего внедрения в Дельфи. Я также создал внедрение в Lua (который не хорошо разбирается во множествах поддержки).

Примечание : Любой код выпущен в общественное достояние. Никакое приписывание не требуется.

9
добавлено
Спасибо! Стоп, it' s настоящее усилие там. I' отметка ll ваш как ' the' ответ.
добавлено автор pepoluan, источник
"Если кто-либо еще может подтвердить какой-либо/весь из этих векторов от их внедрений". - подтвержденный, github.com/airbreather/AirBreather. Common/blob/… все проходит в моем внедрении C#. Спасибо!
добавлено автор Joe Amenta, источник

SMHasher использует a мало установленного порядка, чтобы проверить, что мешанины работают, в основном это вычисляет мешанины для следующих ценностей, используя уменьшающуюся стоимость семени (от 256) для каждого:

' The comment in the SMHasher code is a little wrong -
' it's missing the first case.
{}, {0}, {0, 1}, {0, 1, 2} ... {0, 1, 2, ... 254}

И прилагает это к HASHLENGTH * 256 множество длины, другими словами:

' Where & is a byte array concatenation.
HashOf({}, 256) &
HashOf({0}, 255) &
HashOf({0, 1}, 254) &
...
HashOf({0, 1, ... 254), 1)

Это тогда берет мешанину того большого множества. Первые 4 байта заключительной мешанины интерпретируются как неподписанное 32-битное целое число и проверяются по коду подтверждения:

  • MurmurHash3 x86 32 0xB0F57EE3
  • MurmurHash3 x86 128 0xB3ECE62A
  • MurmurHash3 x64 128 0x6384BA69

К сожалению, это - единственный общественный тест, который я мог найти. Я предполагаю, что другой выбор состоял бы в том, чтобы написать приложение Quick C и крошить некоторые ценности.

Вот мое внедрение C# свидетельства.

static void VerificationTest(uint expected)
{
    using (var hash = new Murmur3())
   //Also test that Merkle incremental hashing works.
    using (var cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write))
    {
        var key = new byte[256];

        for (var i = 0; i < 256; i++)
        {
            key[i] = (byte)i;
            using (var m = new Murmur3(256 - i))
            {
                var computed = m.ComputeHash(key, 0, i);
               //Also check that your implementation deals with incomplete
               //blocks.
                cs.Write(computed, 0, 5);
                cs.Write(computed, 5, computed.Length - 5);
            }
        }

        cs.FlushFinalBlock();
        var final = hash.Hash;
        var verification = ((uint)final[0]) | ((uint)final[1] << 8) | ((uint)final[2] << 16) | ((uint)final[3] << 24);
        if (verification == expected)
            Console.WriteLine("Verification passed.");
        else
            Console.WriteLine("Verification failed, got {0:x8}, expected {1:x8}", verification, expected);
    }
}
5
добавлено
О, мой бог; i' d убивают за испытательный вектор. Поскольку теперь мне нужен тест, чтобы проверить мой тестовый код, который является копией его тестовый код
добавлено автор Ian Boyd, источник

Я улучшил спасительный код от Джонатана. Ваш Murmur3 должен осуществить ICryptoTransform для этого метода, чтобы работать. Можно найти один на GitHub это осуществляет этот интерфейс.

public static  void VerificationTest(uint expected)
{
    using (var hash = new Murmur32ManagedX86())
    {
        using (var cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write))
        {
            var key = new byte[256];

            for (var i = 0; i < 256; i++)
            {
                key[i] = (byte)i;
                using (var mur = new Murmur32ManagedX86((uint)(256 - i)))
                {
                    var computed = mur.ComputeHash(key, 0,i);
                    cs.Write(computed, 0, 4);
                }
            }
            cs.FlushFinalBlock();
            var testBoy = hash.Seed;

            var final = hash.Hash;
            var verification = ((uint)final[0]) | ((uint)final[1] << 8) | ((uint)final[2] << 16) | ((uint)final[3] << 24);
            if (verification == expected)
                Console.WriteLine("Verification passed.");
            else
                Console.WriteLine("Verification failed, got {0:x8}, expected {1:x8}", verification, expected);
        }
    }
}

При использовании внедрение, которое не имеет ICryptoTransform интерфейс, но просто обрабатывает байты, и прибыль интервал (может быть легко изменен, чтобы работать с байт [] также). Вот испытательная функция для этого:

public static void VerificationTest(uint expected)
{
    using (var stream = new MemoryStream())
    {
        var key = new byte[256];

        for (var i = 0; i < 256; i++)
        {
            key[i] = (byte)i;
            var hasher = new MurMurHash3((uint)(256 - i));

            int computed = hasher.ComputeBytesFast(key.Take(i).ToArray());
            stream.Write(BitConverter.GetBytes(computed), 0, 4);
        }
        var finalHasher = new MurMurHash3(0); //initial seed = 0
        int result = finalHasher.ComputeBytesFast2(stream.GetBuffer());
        if (result == (int)expected)
            Console.WriteLine("Verification passed.");
        else
            Console.WriteLine("Verification failed, got {0:x8}, expected {1:x8}", verification, expected);
    }
}
0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)