C# 为什么从我的BerkerleyDB HashDatabase中检索游标的顺序不是递增的
我在windows上使用带c#的BerkerlyDB。我有一个HashDatabase例程,它使用db.Put添加1字节键和1字节数据对。问题是当我使用cursor.movenext()时,它们不是按升序排列的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] =
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没有任何经验,所以我不能说这是否成立,但从名字和你的观察来看,我会说它成立。