ハッシュ方式はたくさんありますが、8096ビット長のビットハッシュを作成したいと思います。これを達成することは可能ですか?
たとえば、「House」と入力すると、次のような文字列が表示されます。
"0101010001010101..." (8096 bits)
どうすればこれを達成できますか(C#4.0を使用しても問題ありません)?
なぜそのようなものが必要なのか疑問に思われる場合は、署名ファイルとベクトル空間モデルを比較するために必要です。
ハッシュ方式はたくさんありますが、8096ビット長のビットハッシュを作成したいと思います。これを達成することは可能ですか?
たとえば、「House」と入力すると、次のような文字列が表示されます。
"0101010001010101..." (8096 bits)
どうすればこれを達成できますか(C#4.0を使用しても問題ありません)?
なぜそのようなものが必要なのか疑問に思われる場合は、署名ファイルとベクトル空間モデルを比較するために必要です。
高速な非暗号化ハッシュについては、FNV ファミリーを調べることができます。慎重かつ適切に変更することで、かなり高速な 8096 ビットのハッシュを構築できるはずです。
速度が主な関心事ではなく、シンプルさと品質が重要な場合は、MD5 のバリアントを使用して非暗号化ハッシュを作成できます。
ハッシュ(x) = MD5(0 || x) || MD5(1 || x) ... MD5(62 || x) || MD5(63 || x)<32>、ここで「||」は連結操作であり、最終ハッシュの下位 32 ビットのみが使用され、8096 ビットのハッシュが得られます。
編集
MD5 の概念を示す小さなコード サンプルを次に示します。
using System;
using System.Security.Cryptography;
using System.Text;
namespace Hash8096
{
    class MainClass
    {
        public static byte [] H8096(byte [] x) {
            byte [] Result = new byte[8096 / 8];
            byte [] Xplus1 = new byte[x.Length + 1];
            x.CopyTo(Xplus1, 1);
            int ResultOffset = 0;
            int AmountLeft = Result.Length;
            for (int i=0; i<64; i++) {
                // do MD5(i || x)
                var md5 = MD5.Create();
                Xplus1[0] = (byte) i;
                var hash = md5.ComputeHash(Xplus1);
                int NumToCopy = Math.Min(hash.Length, AmountLeft);
                Array.Copy(hash, 0, Result, ResultOffset,NumToCopy);
                ResultOffset += NumToCopy;
                AmountLeft -= NumToCopy;
            }
            return Result;
        }
        public static void Main (string[] args)
        {
            byte [] x = Encoding.UTF8.GetBytes("Hello World!");
            byte [] MonsterHash = H8096(x);
            Console.WriteLine ("Monster hash in hex follows:");
            Console.WriteLine(BitConverter.ToString(MonsterHash));
        }
    }
}