如题,业务要求需要标记用户,目前对于未登录用户是使用 IP 和浏览器信息对用户进行唯一标识(然后再 hash 一下,变成统一长度),发现一个问题是储存比较占用空间,目前用最短的 sha1 来做,单个用户也需要 40 个字节才能储存的下来,十万个用户这种数量级的话占用内存感觉有点大了。有什么合适一些的更简短的哈希吗?比如 10 个字节或者 20 个字节就能表示的,最好使用广泛一些的,不用自己实现,我这个需求是不太在意碰撞。
谢谢大家。
如题,业务要求需要标记用户,目前对于未登录用户是使用 IP 和浏览器信息对用户进行唯一标识(然后再 hash 一下,变成统一长度),发现一个问题是储存比较占用空间,目前用最短的 sha1 来做,单个用户也需要 40 个字节才能储存的下来,十万个用户这种数量级的话占用内存感觉有点大了。有什么合适一些的更简短的哈希吗?比如 10 个字节或者 20 个字节就能表示的,最好使用广泛一些的,不用自己实现,我这个需求是不太在意碰撞。
谢谢大家。
|
misdakeMar 5, 2022
1
那就只用 sha1 前 20 个字节?
|
|
popokMar 5, 2022
2
就 10 万规模而已,需要考虑内存占用了吗?
那你参考一楼的说法,想取几位取几位呗。 |
|
3
|
|
ruixueMar 5, 2022
4
|
|
Zy143LMar 5, 2022 via Android
5
Sha 中间取 16 位或者 8 位
|
|
westoyMar 5, 2022
6
第一、sha1 是 byte 20 啊, 你没必要存 hex 40 啊
第二、IP+UA 这个很明显不科学啊。 学校、网吧、普通企业都一样了, 小区宽带走 VLAN+国产浏览器重合率也蛮高的....... |
|
3dwelcomeMar 5, 2022
8
|
|
victorMar 5, 2022
9
SHA1 算法得出的 SHA1 值长度为 20 个 Byte 。10 万个用户就是 200 万 Byte 。1MB = 1048576 Byte ,约 100 万 Byte 。也就是说 10 万个用户,占用了 2 MB 内存。
兄弟们我哪算错了吗? |
|
10
snowflake id
|
|
11
@westoy 确实有这个问题,不过还能怎么区分唯一用户呢?登录以后当然是有身份区分了,未登录的难道用网卡区分,但是网卡不在 http 信息里
|
|
12
@xiaopc "浏览器信息不止 UA ,参考下 fingerprintjs"
我前一阵发过一个关于浏览器指纹的帖子。( https://browserleaks.com/canvas ) 测试的时候,用防指纹浏览器,每次都能给出不同的随机结果。 如果用于未登录用户识别,只会把用户数据源给污染,还不如不用。 |
|
CEBBCATMar 5, 2022
13
见过一种做法,给游客也注册一个账号,只不过这种账号限制了权限,前台也看不到登录状态
|
|
14
|
|
15
@3dwelcome 我在那个网站的获取结果是
Your Fingerprint Signature ✔9D5F1ADC Uniqueness 99.64% (3035 of 850373 user agents have the same signature) Image File Details PNG Hash 193F91E186C48FF3317CBDAC67C612CC 倒是他这个 9D5F1ADC 的短 hash 非常符合我的需求 |
|
Inn0Vat10nMar 5, 2022
16
10 万*40Byte 不算大,真到大的受不了的规模也不会全放内存里
|
|
3dwelcomeMar 6, 2022
17
@LeeReamond "倒是他这个 9D5F1ADC 的短 hash 非常符合我的需求"
看网站下面的说明,好像就是 MD5 截断。 以前我做过一点 hash 的每单位 bit 随机概率测试,有些算法产生的每个 bit 概率不一样,没那么散列。把 MD5 截断后,用 birthday 算法测试冲撞率,基本上没太多变化。 为了缩短空间,该砍就砍吧,这些经典算法设计的都挺好。 |
|
JamesRMar 6, 2022
18
雪花算法( Snowflake )是一种生成分布式全局唯一 ID 的算法,生成的 ID 称为 Snowflake IDs 或 snowflakes 。这种算法由 Twitter 创建,并用于推文的 ID 。
我项目用过,还行,实现简单,也比 UUID 短多了。 |
|
2NUTMar 6, 2022
19
@LeeReamond #15 太扯了,我的
Your Fingerprint Signature ✔9D5F1ADC Uniqueness 99.64% (3035 of 850373 user agents have the same signature) |
|
JamesRMar 6, 2022
20
要么就 Canvas 指纹吧,也用过,还行。
|
|
21
@2NUT 很正常,差不多时间装的差不多的系统,软件环境相似很正常,我找了几个朋友试了试,4 个朋友其中一个跟我结果相同,区分度还是有的
|
|
lysSMar 6, 2022
22
10 万个 sha1 才 4MB 。。。。
|
|
zachlhbMar 6, 2022 via iPhone
23
短 uuid 比较合适
|
|
sampengMar 6, 2022
24
问题来了。。。现在 web 应用很少很少把数据全部放内存里,通常都是数据库一把梭
|
|
2NUTMar 6, 2022
25
@LeeReamond #21 不正常, 因为数量统计都没有增加
3035 of 850373 user |
|
ThieceMar 6, 2022
26
@LeeReamond
其实用 SHAKE128 或者 SHAKE256 就好 |
|
documentzhangx66Mar 6, 2022
27
我就好奇,10 万用户,为啥要 hash ?直接 int 32 自增主键 ID 作为唯一标志,不就完事了,最大能给 21 亿个用户进行唯一标志。
|