为什么hashrow()为相同的字符串值生成不同的哈希?

时间:2014-06-13 14:12:56

标签: hash teradata

使用TD14执行以下脚本。当我运行最终的SELECT时,HashedField返回F5-23-BA-34,但HashedConstant返回2C-30-5B-4F

请注意,对于INSERT,我将常量No限定为constant,然后在该限定符上使用hashrow()。当散列限定符进入时,它会按预期2C-30-5B-4F进行。但是,当我尝试在select中散列字段本身时,我得到F5-23-BA-34。这对我来说毫无意义。

create table mydb.mytable (
    val VARCHAR(3) CHARACTER SET LATIN NOT CASESPECIFIC,
    prehashedval byte(4)
);

insert into mydb.mytable
select 'No' constant, hashrow(constant);

select 
    hashrow(val) HashedField, 
    prehashedval, 
    hashrow('No') HashedConstant 
from mydb.mytable;

1 个答案:

答案 0 :(得分:2)

它不是同一个字符串: - )

字符串文字始终使用Unicode,其哈希值与拉丁文不同:

CREATE VOLATILE  TABLE mytable (
    MyField VARCHAR(3) CHARACTER SET LATIN NOT CASESPECIFIC,
    MyField_U VARCHAR(3) CHARACTER SET UNICODE NOT CASESPECIFIC
) ON COMMIT PRESERVE ROWS;

INSERT INTO mytable('No', 'No');

SELECT 
    HASHROW(MyField) HashedField, 
    HASHROW(TRANSLATE('No' USING unicode_to_latin)),
    HASHROW(MyField_U) HashedField_U, 
    HASHROW('No')
FROM mytable;