Javascript 我是否在使用此解决方案避免哈希冲突?

Javascript 我是否在使用此解决方案避免哈希冲突?,javascript,html,Javascript,Html,我在一个页面上有一个textarea元素,单击我创建的save按钮,它的内容就会保存到我的数据库中。我想用散列id创建短URL,如“MySite.com/laHquq”,使用我保存记录的表行的唯一id(主键),其中包含textarea中的信息,这将“从数字生成短散列(如YouTube和Bitly)。”我想用它来混淆表行的唯一主键和包含textarea信息的记录 我将使用一个脚本将创建的哈希id(这会混淆主键)放在地址栏中域名末尾的正斜杠之后,这样在信息保存到我的数据库后,地址栏现在将有:“MyS

我在一个页面上有一个textarea元素,单击我创建的save按钮,它的内容就会保存到我的数据库中。我想用散列id创建短URL,如“MySite.com/laHquq”,使用我保存记录的表行的唯一id(主键),其中包含textarea中的信息,这将“从数字生成短散列(如YouTube和Bitly)。”我想用它来混淆表行的唯一主键和包含textarea信息的记录

我将使用一个脚本将创建的哈希id(这会混淆主键)放在地址栏中域名末尾的正斜杠之后,这样在信息保存到我的数据库后,地址栏现在将有:“MySite.com/laHquq”。这样做只是为了表明现在保存在textarea中的信息可以通过在正斜杠后使用hash id访问站点再次看到


我还将有一个带有自调用函数的脚本,该脚本将在每次加载页面时从地址栏获取url,并在正斜杠后检查哈希id,然后使用哈希id从db中查找正确的信息,以显示在页面的文本区域中。我想知道使用hashids:是否有助于防止哈希冲突

从文档中可以看出,您永远不会遇到与hashid的冲突。那是因为它不是杂烩。这是一种密码——一种加密算法。这是一个非常弱的方法,但足以生成看起来像散列的ID

一个关键线索是有一个
解密
函数。真正的散列(可能发生冲突的散列)无法解密为单个值,因为有多个值(通常是无限的)生成相同的散列


在某些方面,它与base64编码类似,但选择了一个URL友好的字符集(无
+
/
)。

这里显示了PHP的经验结果。 我们已经用至少5焦耳的盐进行了测试,如下所示:

$hashids = new Hashids\Hashids('this is my salt', 5, 'BCDFGHJKLMNPQRSTVWXYZ0123456789');
一个进程在一个循环中全天候运行一周,以填充MySQL数据库中的行,从1散列PK,如下表所示:

create table hashids (
    id int NOT NULL AUTO_INCREMENT primary key,
    hash varchar(255)
);
使用散列中的唯一索引,在脚本期间控制重复键,并在进程结束时运行SELECT DISTINCT以进行健全性检查

我们停止了这个过程

select count(*) from hashids;
+-----------+
| count(*)  |
+-----------+
| 355325777 |
+-----------+
然后我们决定从接近签名BIGINT的上限开始

ID: 9223372036854775000-> HASH: RQ0ZPNPPPZ6Q7RNV
ID: 9223372036854775329-> HASH: YN2K8Y888K7NW6VY
ID: 9223372036854775654-> HASH: 2MQ0474440VM8QMY
ID: 9223372036854775777-> HASH: 7L25R7RRR5ZL820W
ID: 9223372036854775805-> HASH: 020WV7VVVWX250YM
ID: 9223372036854775807-> HASH: QVMZYRYYYZXVLM0W
在这两种情况下,运行了几天并填充了15Gb的ID后,hashid仍然有效

我们确认目前没有发现碰撞。

这个测试远远超出了我们应用程序的限制,因此我们认为hashid对我们来说是安全的。当然,和数学一样,经验结果并不能证明规律

还要记住,在达到有符号/无符号BIGINT MySQL DB限制或PHP_INT_MAX之前,Hashids有一个上限,至少在PHP中是这样。

发现了冲突

        'main' => [
            'salt' => 'KorvpalliSuuruneTennisePall666',
            'length' => '8',
            'alphabet' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
        ],
我认为是这样。还有太多。区分大小写的“Y”。根据我的测试,没有碰撞。
Hashids::encode(250) results DoGxYxgJ
Hashids::encode(294) results DoGxYxgJ