PHP/MySQL: 散列公共数据
PHP/MySQL: Hashing common data
我正在查看我当前的数据库设置,它由大约 7 个不同 table 中的大量用户完整家庭地址组成,所有数据都具有不同程度的不一致数据(由于方式例如,人们可以输入他们的邮政编码 with/without 个空格)。
有问题的应用程序尚未上线 - 距离完全完成不远但仍未上线,因此现在进行任何更改都比说 6 个月后要容易得多,因为 tables.
是否值得我花几个小时重构处理用户家庭地址的 code/database,而不是每次都使用哈希算法插入完整地址?
这将为我们提供更大的一致性,并且显然可以以用户可以共享地址哈希的方式进行设置,因此我们甚至可以更轻松地按地址搜索它们。
我们目前使用这种方法来存储用户代理 - 对 UA 字符串进行哈希处理并将其存储在自己单独的 table 中,旁边是用于实际 UA 字符串的中文本列,然后我们存储 UA在需要它的 table 中散列(见下文),并使用 SHA1。但是,在基于非冲突的散列方面,我有哪些选项可用,但您还看到在中小型生产环境中以最快的速度执行?
这意味着两个明显的问题,MD5/SHA1 100% 没有发生,不幸的是,我并没有真正使用比这更大的哈希值。
作为记录,我使用 password_hash
进行密码加密,所以不要惊慌失措!
显然,用户的家庭住址比用户代理字符串重要得多,这就是为什么我要问你推荐什么。
谢谢
对于那些想知道的人,我选择了 SHA256。
我没有意识到 openssl 中实际上有一个函数可以对哈希算法进行基准测试,可以像这样使用:openssl speed alg1 alg2 alg3 etc
查看下面 table 中的 64/256 字节结果,虽然显然它的执行速度不如 MD5/SHA1,但我认为它仍然足够快以用于生产.
我想我会 post 这个并让任何不了解 openssl speed
的人试一试。
[root@prod-use1a ec2-user]# openssl speed md5 sha1 sha256 sha512
Doing md5 for 3s on 16 size blocks: 9785239 md5's in 3.00s
Doing md5 for 3s on 64 size blocks: 7076501 md5's in 2.99s
Doing md5 for 3s on 256 size blocks: 3832312 md5's in 3.00s
Doing md5 for 3s on 1024 size blocks: 1363911 md5's in 3.00s
Doing md5 for 3s on 8192 size blocks: 194888 md5's in 3.00s
Doing sha1 for 3s on 16 size blocks: 10839355 sha1's in 3.00s
Doing sha1 for 3s on 64 size blocks: 7479305 sha1's in 2.99s
Doing sha1 for 3s on 256 size blocks: 4024302 sha1's in 3.00s
Doing sha1 for 3s on 1024 size blocks: 1478185 sha1's in 3.00s
Doing sha1 for 3s on 8192 size blocks: 227631 sha1's in 3.00s
Doing sha256 for 3s on 16 size blocks: 7984178 sha256's in 3.00s
Doing sha256 for 3s on 64 size blocks: 4370920 sha256's in 3.00s
Doing sha256 for 3s on 256 size blocks: 1904856 sha256's in 3.00s
Doing sha256 for 3s on 1024 size blocks: 589307 sha256's in 3.00s
Doing sha256 for 3s on 8192 size blocks: 77639 sha256's in 2.99s
Doing sha512 for 3s on 16 size blocks: 6481869 sha512's in 3.00s
Doing sha512 for 3s on 64 size blocks: 6479426 sha512's in 3.00s
Doing sha512 for 3s on 256 size blocks: 2425680 sha512's in 3.00s
Doing sha512 for 3s on 1024 size blocks: 869702 sha512's in 3.00s
Doing sha512 for 3s on 8192 size blocks: 120660 sha512's in 3.00s
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 52187.94k 151470.26k 327023.96k 465548.29k 532174.17k
sha1 57809.89k 160092.15k 343407.10k 504553.81k 621584.38k
sha256 42582.28k 93246.29k 162547.71k 201150.12k 212715.28k
sha512 34569.97k 138227.75k 206991.36k 296858.28k 329482.24k
[root@prod-use1a ec2-user]#
我正在查看我当前的数据库设置,它由大约 7 个不同 table 中的大量用户完整家庭地址组成,所有数据都具有不同程度的不一致数据(由于方式例如,人们可以输入他们的邮政编码 with/without 个空格)。
有问题的应用程序尚未上线 - 距离完全完成不远但仍未上线,因此现在进行任何更改都比说 6 个月后要容易得多,因为 tables.
是否值得我花几个小时重构处理用户家庭地址的 code/database,而不是每次都使用哈希算法插入完整地址? 这将为我们提供更大的一致性,并且显然可以以用户可以共享地址哈希的方式进行设置,因此我们甚至可以更轻松地按地址搜索它们。
我们目前使用这种方法来存储用户代理 - 对 UA 字符串进行哈希处理并将其存储在自己单独的 table 中,旁边是用于实际 UA 字符串的中文本列,然后我们存储 UA在需要它的 table 中散列(见下文),并使用 SHA1。但是,在基于非冲突的散列方面,我有哪些选项可用,但您还看到在中小型生产环境中以最快的速度执行?
这意味着两个明显的问题,MD5/SHA1 100% 没有发生,不幸的是,我并没有真正使用比这更大的哈希值。
作为记录,我使用 password_hash
进行密码加密,所以不要惊慌失措!
显然,用户的家庭住址比用户代理字符串重要得多,这就是为什么我要问你推荐什么。
谢谢
对于那些想知道的人,我选择了 SHA256。
我没有意识到 openssl 中实际上有一个函数可以对哈希算法进行基准测试,可以像这样使用:openssl speed alg1 alg2 alg3 etc
查看下面 table 中的 64/256 字节结果,虽然显然它的执行速度不如 MD5/SHA1,但我认为它仍然足够快以用于生产.
我想我会 post 这个并让任何不了解 openssl speed
的人试一试。
[root@prod-use1a ec2-user]# openssl speed md5 sha1 sha256 sha512
Doing md5 for 3s on 16 size blocks: 9785239 md5's in 3.00s
Doing md5 for 3s on 64 size blocks: 7076501 md5's in 2.99s
Doing md5 for 3s on 256 size blocks: 3832312 md5's in 3.00s
Doing md5 for 3s on 1024 size blocks: 1363911 md5's in 3.00s
Doing md5 for 3s on 8192 size blocks: 194888 md5's in 3.00s
Doing sha1 for 3s on 16 size blocks: 10839355 sha1's in 3.00s
Doing sha1 for 3s on 64 size blocks: 7479305 sha1's in 2.99s
Doing sha1 for 3s on 256 size blocks: 4024302 sha1's in 3.00s
Doing sha1 for 3s on 1024 size blocks: 1478185 sha1's in 3.00s
Doing sha1 for 3s on 8192 size blocks: 227631 sha1's in 3.00s
Doing sha256 for 3s on 16 size blocks: 7984178 sha256's in 3.00s
Doing sha256 for 3s on 64 size blocks: 4370920 sha256's in 3.00s
Doing sha256 for 3s on 256 size blocks: 1904856 sha256's in 3.00s
Doing sha256 for 3s on 1024 size blocks: 589307 sha256's in 3.00s
Doing sha256 for 3s on 8192 size blocks: 77639 sha256's in 2.99s
Doing sha512 for 3s on 16 size blocks: 6481869 sha512's in 3.00s
Doing sha512 for 3s on 64 size blocks: 6479426 sha512's in 3.00s
Doing sha512 for 3s on 256 size blocks: 2425680 sha512's in 3.00s
Doing sha512 for 3s on 1024 size blocks: 869702 sha512's in 3.00s
Doing sha512 for 3s on 8192 size blocks: 120660 sha512's in 3.00s
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 52187.94k 151470.26k 327023.96k 465548.29k 532174.17k
sha1 57809.89k 160092.15k 343407.10k 504553.81k 621584.38k
sha256 42582.28k 93246.29k 162547.71k 201150.12k 212715.28k
sha512 34569.97k 138227.75k 206991.36k 296858.28k 329482.24k
[root@prod-use1a ec2-user]#