checksum

yubofighting 2012-05-03 08:41:28
请教一下,
1、什么情况下使用checksum?

2、checksum(para1)和checksum(para2)有可能得到相同的值吗(para1和para2是不同的值)
...全文
127 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
siegebaoniu 2012-05-05
  • 打赏
  • 举报
回复
checksum有个bug ,字段里有- 的最好别用。

select checksum('ab')
select checksum('a-b')
-- have the same result 151912974

Mr_Nice 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
请教一下,
1、什么情况下使用checksum?

2、checksum(para1)和checksum(para2)有可能得到相同的值吗(para1和para2是不同的值)
[/Quote]

checksum的典型性用法可以替代文本检索。比如为文本字段添加一个对应的checksum计算列,然后筛选时,使用
where 计算列=checksum('文本') 方式进行检索。可以提高检索文本的效率。

至于俩个不同的值完全有可能会生成相同的值。毕竟checksum是校验
yubofighting 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code


返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。

Transact-SQL 语法约定

语法

CHECKSUM ( * | expression [ ,...n ] )


参数
*
指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。
非可比数据类型有 tex……
[/Quote]

msdn我也会查的,我看了msdn才发了这两个问题
  • 打赏
  • 举报
回复

返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。

Transact-SQL 语法约定

语法

CHECKSUM ( * | expression [ ,...n ] )


参数
*
指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。
非可比数据类型有 text、ntext、image、XML 和 cursor,还包括以上述任一类型作为
基类型的 sql_variant。

expression
除非可比数据类型之外的任何类型的表达式。

返回类型
int

备注
CHECKSUM 对其参数列表计算一个称为校验和的哈希值。此哈希值用于生成哈希索引。
如果 CHECKSUM 的参数为列,并且对计算的 CHECKSUM 值生成索引,则结果是一个哈
希索引。它可用于对列进行等价搜索。

CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表
的相应元素具有相同类型且相等,则在任何两个表达式列表上应用的 CHECKSUM 将返
回同一值。对于该定义,指定类型的 Null 值被作为相等进行比较。如果表达式列表
中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验和
会保持不变。因此,我们不推荐使用 CHECKSUM 来检测值是否更改,除非应用程序可
以容忍偶尔丢失更改。请考虑改用 HashBytes。指定 MD5 哈希算法时,HashBytes
为两个不同输入返回相同结果的可能性比 CHECKSUM 小得多。

表达式的顺序影响 CHECKSUM 的结果值。用于 CHECKSUM(*) 的列顺序是表或视图定义
中指定的列顺序。其中包括计算列。


示例
以下示例演示如何使用 CHECKSUM 生成哈希索引。通过将计算校验和列添加到索引的表中
,然后对校验和列生成索引来生成哈希索引。

复制代码
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks;
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO


校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提
高索引速度。校验和索引可用于等价搜索。


/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not the same.*/
SELECT *
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';
GO


对计算列创建索引将具体化为校验和列,对 ProductName 值所做的任何更改都将传播到校验和列。
也可以直接对索引的列生成索引。然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧