C# 为什么从我的BerkerleyDB HashDatabase中检索游标的顺序不是递增的

C# 为什么从我的BerkerleyDB HashDatabase中检索游标的顺序不是递增的,c#,berkeley-db,C#,Berkeley Db,我在windows上使用带c#的BerkerlyDB。我有一个HashDatabase例程,它使用db.Put添加1字节键和1字节数据对。问题是当我使用cursor.movenext()时,它们不是按升序排列的 env = OpenEnv(); db = OpenDB(env, dBName); byte[] rec1 = new byte[1]; rec1[0] =

我在windows上使用带c#的BerkerlyDB。我有一个HashDatabase例程,它使用db.Put添加1字节键和1字节数据对。问题是当我使用cursor.movenext()时,它们不是按升序排列的

                env = OpenEnv();
                db = OpenDB(env, dBName);
                byte[] rec1 = new byte[1];
                rec1[0] = (byte)'D';
                byte[] data = new byte[1] { 0 };
                BDB.DatabaseEntry dbek1 = new BDB.DatabaseEntry(rec1);
                db.Put(dbek1, new BDB.DatabaseEntry(data));
                byte[] rec2 = new byte[1];
                rec2[0] = (byte)'C';
                BDB.DatabaseEntry dbek2 = new BDB.DatabaseEntry(rec2);
                db.Put(dbek2, new BDB.DatabaseEntry(data));
                cursor = db.Cursor();
                while (cursor.MoveNext())
                {
                    sb.Clear();
                    byte[] key = cursor.Current.Key.Data;
                    byte[] d = cursor.Current.Value.Data;
                    foreach (char c in key)
                        sb.Append(c);
                    sb.Append(' ');
                    foreach (int c in d)
                        sb.Append(c.ToString() + " ");
                    Console.WriteLine(sb.ToString());
                } 

        private static BDB.HashDatabase OpenDB(BDB.DatabaseEnvironment env, string dbFileName)
        {
            BDB.HashDatabaseConfig hashConfig = new BDB.HashDatabaseConfig();
            hashConfig.Env = env;
            hashConfig.Duplicates = BDB.DuplicatesPolicy.SORTED;
            hashConfig.Creation = BDB.CreatePolicy.IF_NEEDED;
            hashConfig.PageSize = 4 * 4096;
            hashConfig.FillFactor = (hashConfig.PageSize - 26) / (1 + 1 + 6);
            //            hashConfig.TableSize = 2000000;
            return BDB.HashDatabase.Open(dbFileName, hashConfig);
        }
        private static BDB.DatabaseEnvironment OpenEnv()
        {
            BDB.MPoolConfig mpoolConfig = new BDB.MPoolConfig();
            uint cacheSize = 2;
            mpoolConfig.MaxCacheSize = new BDB.CacheInfo(cacheSize, 8192 * 4096, 1);
            mpoolConfig.CacheSize = new BDB.CacheInfo(cacheSize, 4096 * 4096, 1);
            BDB.MutexConfig mutexConfig = new BDB.MutexConfig();
            mutexConfig.InitMutexes = 0;
            mutexConfig.MaxMutexes = 0;
            mutexConfig.Increment = 0;
            BDB.DatabaseEnvironmentConfig envConfig = new BDB.DatabaseEnvironmentConfig();
            envConfig.MPoolSystemCfg = mpoolConfig;
//            envConfig.NoMMap = true;
            envConfig.Private = true;
            envConfig.Create = true;
            envConfig.UseMPool = true;
            envConfig.ForceFlush = true;
            envConfig.MutexSystemCfg = mutexConfig;
            return BDB.DatabaseEnvironment.Open(".", envConfig);
        }

如果您有任何想法,我们将不胜感激。

是记录将通过使用DB_哈希的游标返回

如果您希望通过游标排序,最简单的解决方法是从DB_HASH切换到DB_BTREE,在这里树叶总是被排序的。(但请注意,如果您使用的是整数键,则应该对键使用网络/bigendian顺序)


否则,从哈希表中检索后进行排序就不难了。

最有可能的情况是,光标按照记录或键在基础哈希表中的存储顺序(根据名称判断)检索记录或键。无法保证钥匙会以任何特定顺序检索。你几乎可以说,你的保证是,你不会返回他们在一个特定的顺序。这就是哈希表的本质。我对伯克利DB没有任何经验,所以我不能说这是否成立,但从名字和你的观察来看,我会说它成立。