假设Oracle数据库中表是 Test ,字段是tagid。现在由于加密的需要,字段tagid里的每一个值都要接受传入的一个随机值random然后用hash()函数加密得到 Hash(Random+tagid)的值。现在就是要检索的输入是random和Hash(Random+tagid)两个参数。所以tagid字段里的每一个值,都要接受random,然后计算Hash(Random+tagid)与输入的值比较找到。现在问题是
1。在数据库端,这种情况下,应该索引就不管用了,有没有什么优化检索的方法。
2。下面是我的实现的语句的片段,大家看看vc能有什么优化的地方没有呢。
    难道每次检索都要遍历吗?在100W条记录的数据库检索一条数据好花好几秒,这怎么受得了。以前没用过vc操作过数据库,请大虾指导一下
........//连接数据库
m_pRecordset=m_pConnection->Execute(...);
for(i=1;i<=notenumer;i++)
{
varvalue=(long)m_pRecordset->GetFields()->GetItem(long)0)->value;
hashedvalue=hash(varvalue);//hash()函数
if(hashedvalue!=prevalue)  //比较传入的参数和计算后的值
{
m_pRecordset->MoveNext();
j++;   
else
{
.......//统计系统运行时间
break;
}
}
}

解决方案 »

  1.   

    程序少写了一点m_pRecordset=m_pConnection->Execute(...);
    for(i=1;i<=notenumer;i++)
    {
    varvalue=(long)m_pRecordset->GetFields()->GetItem(long)0)->value;
    //将random放在varvalue前面 varvalue=random//varvalue
    hashedvalue=hash(varvalue);//hash()函数
    if(hashedvalue!=prevalue)  //比较传入的参数和计算后的值
    {
    m_pRecordset->MoveNext();
    j++;   
    else
    {
    .......//统计系统运行时间
    break;
    }
    }
    }
      

  2.   

    我没说明白吗,字段tagid里的每一条记录要经过这样一个运算来比较
    hash(random//tagid)                /*将随机生成的字符串random放在tagid前*/
    然后与传入的这个值比较,找到这条记录.也就是说传入的参数,有random和硬件平台生成     hash(random//tagid)值,这两个参数
    这不是很难理解吧
      

  3.   

    hash函数在客户端?
    能否写到服务器去?
      

  4.   

    你是说,要检索一个记录,必须要用到俩参数:random和hash之后的结果hashedvalue是吧?数据库里存的是啥?直接就是tagid? 没hash过的内容吧?能否保存hash过的值?
    然后hash(xxx/*要查找的东西*/),得到结果之后再到数据库里select ...where ....
      

  5.   

    to 21bird:
    数据库中存放的是tagid,你保存hash过的值没有用啊,每一次的random值都是不一样的.而且hash函数是不可逆的.不能由hash(random//tagid)反向得到其中的taigid.
    现在我最想知道的是我的vc语句中有没有可以优化的地方.比如说
    m_pRecordset=m_pConnection->Execute(...);
    m_pRecordset->Open(....);
    m_pCommand->Execute(...);
    这三种操作数据集的方法有什么不同,那种最快呢?
    另外,数据库就在我的本机上,hash放在数据库内能加快吗?而且hash函数中含有很多的二进制位移运算...不知道oracle支持不..
      

  6.   

    1。m_pCommand->Execute(...);
    似乎支持prepare sql啊……你执行的sql是不是select where样式的?如果是,就可以用prepare 方式执行……2。oracle应该支持吧?就算不支持,oracle他支持java啊,java是程序语言,肯定支持如算法啊,二进制计算啊之类的吧?写个java过程,让oracle调用,好像oracle可以象调用普通存储过程一样调用java代码的……希望我没说错……
      

  7.   

    以为你用啥数据库,原来居然是oracle,这个东西好玩啊,功能多多,只要你肯做,会做,
    愿意咋实现就咋实现:)
      

  8.   

    21bird,先谢了
    m_pCommand->Execute(...);
    似乎支持prepare sql啊……你执行的sql是不是select where样式的?如果是,就可以用prepare 方式执行……
    恩....这是最快的吗?试一试
      

  9.   

    move the hash function in Orcale and use it in your query.