如何解决哈希不匹配
我对相同的值进行哈希处理,但得到不同的结果。
这是一个简单的例子来解释我遇到的情况:
我有一个如下所示的维度表:
性别 | gender_id |
---|---|
男 | 1 |
女性 | 0 |
gender 的数据类型是 NVARCHAR(6),gender_id 是 INT
当我执行以下任何查询时,我得到相同的哈希值:
> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server x64 (build 14393)
Matrix products: default
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] purrr_0.3.4 officer_0.3.15 ggplot2_3.3.3 stringr_1.4.0
[5] nvimcom_0.9-92.3
loaded via a namespace (and not attached):
[1] xml2_1.3.2 magrittr_2.0.1 tidyselect_1.1.0 munsell_0.5.0
[5] uuid_0.1-4 colorspace_1.4-1 R6_2.5.0 rlang_0.4.8
[9] dplyr_1.0.2 tools_4.0.3 grid_4.0.3 gtable_0.3.0
[13] withr_2.3.0 ellipsis_0.3.1 tibble_3.0.4 lifecycle_0.2.0
[17] crayon_1.3.4 zip_2.1.1 vctrs_0.3.4 glue_1.4.2
[21] stringi_1.5.3 compiler_4.0.3 pillar_1.4.6 generics_0.1.0
[25] scales_1.1.1 pkgconfig_2.0.3
>
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
**Scenario 1:**
SELECT
CONVERT(BINARY(20),HASHBYTES('Md5',Concat(Gender,cast(gender_id as int))))
FROM demographic
WHERE gender = 'Male';
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
在场景1中,我将gender_id转换为INT,在场景2中我将gender_id转换为NVARCHAR。在这两种情况下,哈希值是相同的。
当我执行调用维度中特定值而不是列的查询时,我的哈希值不同:
**Scenario 2:**
SELECT
CONVERT(BINARY(20),CAST(gender_id AS NVARCHAR(1)))))
FROM demographic
WHERE gender = 'Male';
输出:'0x048A5F0EE2D2B4070CFF8A38CB6DAC7100000000'
**Scenario 3:**
SELECT CONVERT(BINARY(20),HASHBYTES('MD5',Concat('Male',CAST(1 as INT))));
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
在场景 3 中,我像在场景 1 中一样将 1 转换为 INT。在场景 4 中,我像在场景 2 中一样将 1 转换为 NVARCHAR。然而,场景 3 和 4 具有不同的哈希值。除此之外,场景 4 的哈希值与场景 1 和 2 中的哈希值一致。
我无法理解为什么场景 1、2 和 4 的哈希值相同,但场景 3 的哈希值不同。在我的维度中,gender_id 是一个 INT。当我查询我的维度时,无论我如何转换它,哈希值总是相同的。在场景 3 和 4 中,当我用实际值替换列名时,结果会发生变化。除非我将其转换为 NVARCHAR,否则场景 3 中的哈希将不匹配场景 1 和 2。为什么这是因为gender_id 自然是一个INT?
非常感谢您提供的任何见解,并很乐意在需要时提供更多说明。
谢谢!
解决方法
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.0.5/vue.global.js"></script>
<script type="module" src="./my-component.js"></script>
<div id="app">
<my-component></my-component>
</div>
<script type="module" src="./close-app.js"></script>
是 ANSI 'Male'
值,而不是 Unicode varchar
。对于 Unicode,您需要 nvarchar
例如,我得到以下查询结果:
N'Male'
0x4D616C65
然而,请注意在文字前添加 select convert(varchar(20),cast('Male' as varbinary(20)),1)
:
N
0x4D0061006C006500
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。