【发布时间】:2011-08-18 14:51:23
【问题描述】:
我有一个包含多个文本列的数据库表,这些列必须是唯一的,我不想使用多列键,所以我想将字符串一起散列成一个 int 并将其用作主键.我想知道利用uint qHash ( const QString & key ) 或编写我自己的函数是否更好,因为数据库需要由不同地方的不同人编辑。 (另外,如果整个方法不好,请帮忙。)
【问题讨论】:
标签: string qt database-design hash primary-key
我有一个包含多个文本列的数据库表,这些列必须是唯一的,我不想使用多列键,所以我想将字符串一起散列成一个 int 并将其用作主键.我想知道利用uint qHash ( const QString & key ) 或编写我自己的函数是否更好,因为数据库需要由不同地方的不同人编辑。 (另外,如果整个方法不好,请帮忙。)
【问题讨论】:
标签: string qt database-design hash primary-key
qHash 的实现如下:
static uint hash(const uchar *p, int n)
{
uint h = 0;
uint g;
while (n--) {
h = (h << 4) + *p++;
if ((g = (h & 0xf0000000)) != 0)
h ^= g >> 23;
h &= ~g;
}
return h;
}
static uint hash(const QChar *p, int n)
{
uint h = 0;
uint g;
while (n--) {
h = (h << 4) + (*p++).unicode();
if ((g = (h & 0xf0000000)) != 0)
h ^= g >> 23;
h &= ~g;
}
return h;
}
该代码中没有特定于平台的内容。然而,哈希算法并不能像数据库那样保证唯一性。它尽最大努力避免碰撞,但不能保证。这就是为什么大多数哈希容器使用桶和重新分配算法的原因。
【讨论】: