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