Skip to content

Instantly share code, notes, and snippets.

@KEINOS KEINOS/SQL文
Last active Oct 10, 2019

Embed
What would you like to do?
hashアルゴリズムとハッシュ値の長さ一覧 ref: https://qiita.com/KEINOS/items/c92268386d265042ea16
// 値が異なる $a と $b
$a = 'xx..1..xx'
$b = 'xx..0..xx'
hash('md5', $a) === hash('md5', $b) // true, 偶然にも衝突が発生!
hash('md2', $a) === hash('md2', $b) // false, アルゴリズムが異なると衝突しない(可能性が高い)
$key_prime_new = hash('fnv164', $key_prime_old);
CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z);
$key_prime_hex = hash('fnv132', $value) . hash('crc32', $value);
$key_prime_new = hash('fnv164', $key_prime_old);
$key_prime_new = hash('fnv164', $key_prime_old);
// 旧IDでデータ取得
$value = fetchValueFromDB($key_prime_old);
// データ → ハッシュ化(16進)→ 10進 → 整数
$key_prime_new = (integer) hexdec(hash('fnv164', $value));
$key_prime_new = hash('fnv164', $key_prime_old);
$key_prime_new = hash('fnv164', $key_prime_old);
// 旧IDでデータ取得
$value = fetchValueFromDB($key_prime_old);
// データ → ハッシュ化(16進)→ 10進 → 整数
$key_prime_new = (integer) hexdec(hash('fnv164', $value));
$key_prime_new = hash('fnv164', $key_prime_old);
// 旧IDでデータ取得
$value = fetchValueFromDB($key_prime_old);
// データ → ハッシュ化(16進)→ 10進 → 整数
$key_prime_new = (integer) hexdec(hash('fnv164', $value));
CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z);
$ # 絹ごし牛ミンチ
$ php -r 'echo hash("sha512", "beef"), PHP_EOL;'
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ(コマンドの言語が違っても同じアルゴリズムと引数なら同じミンチ肉)
$ echo -n 'beef' | openssl sha512
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ+ 1g の塩入り
$ php -r '$salt=1; echo hash("sha512", "beef" . $salt), PHP_EOL;'
a528829f370819123ad3fb04d8066b77ec79ce6eddad07e5b2c925bbd9b2e699e73428d23315875c29b45500b8c767262cf5546e33974e4f7a6102abd1bb045e
$
$ # 絹ごし牛ミンチ+ 1g の塩入り(コックが違っても同じレシピなら同じ味)
$ salt=1; echo -n 'beef'$salt | openssl sha512
a528829f370819123ad3fb04d8066b77ec79ce6eddad07e5b2c925bbd9b2e699e73428d23315875c29b45500b8c767262cf5546e33974e4f7a6102abd1bb045e
$len = 8; //4バイトのHEX文字列長
$value = fetchValueFromDB($key_prime_old);
$hash1 = substr(hash('sha256', $value), 0, $len);
$hash2 = substr(hash('sha512', $value), 0, $len);
// 8バイトの主キー
$key_prine_new = (integer) hexdec($hash1 . $hash2);
$ # 粗挽き牛ミンチ
$ php -r 'echo hash("md5", "beef"), PHP_EOL;'
34902903de8d4fee8e6afe868982f0dd
$
$ # 粗挽き牛ミンチ(二度目でも同じミンチ肉)
$ php -r 'echo hash("md5", "beef"), PHP_EOL;'
34902903de8d4fee8e6afe868982f0dd
$
$ # 粗挽き牛ミンチ+ 1g の塩入り
$ php -r 'echo hash("md5", "beef" . "salt 1g"), PHP_EOL;'
cf06d6a163ee0ca858d008767654e893
$
$ # 絹ごし牛ミンチ
$ php -r 'echo hash("sha512", "beef"), PHP_EOL;'
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ(二度目でも同じミンチ肉)
$ php -r 'echo hash("sha512", "beef"), PHP_EOL;'
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ+ 1g の塩入り
$ php -r 'echo hash("sha512", "beef" . "salt 1g"), PHP_EOL;'
6b545481ac7d8e61267745ed39f2a135d5eeff65cdb992f34794f87f843ab8bedd29bbd07ff9444b3005f1d3fcb36ce213f54b63481708eeb691f71f5afe155a
$list_url_visited=[
'http://hoge.com/p1',
'http://hoge.com/p6',
'http://hoge.com/p4',
...
];
asort($list_url_visited); //配列をソート
$string = implode(' ', $list_url_visited); //配列を文字列に結合
$id_visited = hash('md5', $string); //文字列をハッシュ化
$ php -a
Interactive shell
php > $url_pdf1='https://shattered.io/static/shattered-1.pdf';
php > $url_pdf2='https://shattered.io/static/shattered-2.pdf';
php >
php > $algo = 'sha1'; //衝突する
php > echo hash($algo, file_get_contents($url_pdf1)), PHP_EOL;
38762cf7f55934b34d179ae6a4c80cadccbb7f0a
php > echo hash($algo, file_get_contents($url_pdf2)), PHP_EOL;
38762cf7f55934b34d179ae6a4c80cadccbb7f0a
php >
php > $algo = 'md5'; //衝突しない
php > echo hash($algo, file_get_contents($url_pdf1)), PHP_EOL;
ee4aa52b139d925f8d8884402b0a750c
php > echo hash($algo, file_get_contents($url_pdf2)), PHP_EOL;
5bd9d8cabc46041579a311230539b8d1
php > exit
$ # 粗挽き牛ミンチ
$ php -r 'echo hash("md5", "beef"), PHP_EOL;'
34902903de8d4fee8e6afe868982f0dd
$
$ # 粗挽き牛ミンチ(コマンドの言語が違っても同じアルゴリズムと引数なら同じミンチ肉)
$ echo -n 'beef' | openssl md5
34902903de8d4fee8e6afe868982f0dd
$ # 絹ごし牛ミンチ
$ php -r 'echo hash("sha512", "beef"), PHP_EOL;'
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ(二度目でも同じミンチ肉)
$ php -r 'echo hash("sha512", "beef"), PHP_EOL;'
8cd8bb0cef938ef9cd054c2c2cb965e83310ab5c197cb5fc8f35892a44c1a028bac9e1bcd6248580fa2739cc96074885ea3ee116ef35c2d8f6124270aeff50b7
$
$ # 絹ごし牛ミンチ+ 1g の塩入り
$ php -r '$salt=1; echo hash("sha512", "beef" . $salt), PHP_EOL;'
a528829f370819123ad3fb04d8066b77ec79ce6eddad07e5b2c925bbd9b2e699e73428d23315875c29b45500b8c767262cf5546e33974e4f7a6102abd1bb045e
$ # 粗挽き牛ミンチ+ 1 の塩入り
$ php -r '$salt=1; echo hash("md5", "beef" . $salt), PHP_EOL;'
30017279d6a5bac241e764eeed261dd8
$
$ # 同じレシピで、違う言語のコマンド(bash)
$ salt=1; echo -n 'beef'$salt | openssl md5
30017279d6a5bac241e764eeed261dd8
<?php
$url_pdf1='https://shattered.io/static/shattered-1.pdf';
$url_pdf2='https://shattered.io/static/shattered-2.pdf';
$algo = 'sha1'; //衝突する
echo hash($algo, file_get_contents($url_pdf1)), PHP_EOL;
echo hash($algo, file_get_contents($url_pdf2)), PHP_EOL;
$algo = 'md5'; //衝突しない
echo hash($algo, file_get_contents($url_pdf1)), PHP_EOL;
echo hash($algo, file_get_contents($url_pdf2)), PHP_EOL;
exit
<?php
// MD5 で衝突するサンプルデータ
$str1 = '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518'
. 'afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2';
// ↑ ↑
$str2 = '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518'
. 'afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2';
// ↑ ↑
// バイナリに変換
$bin1 = hex2bin(trim($str1));
$bin2 = hex2bin(trim($str2));
// 衝突させる
$algo = 'md5';
$md5_1 = hash($algo, $bin1);
$md5_2 = hash($algo, $bin2);
echo ( $md5_1 === $md5_2 ) ? '衝突しました' : '衝突していません', PHP_EOL;
// 別のアルゴリズムで確認
$algo = 'sha1';
$sha1_1 = hash($algo, $bin1);
$sha1_2 = hash($algo, $bin2);
echo ( $sha1_1 === $sha1_2 ) ? '衝突しました' : '衝突していません', PHP_EOL;
/* 出力結果 */
// 衝突しました
// 衝突していません
// 値が異なる $a と $b
$a = 'xxxxx..1..xxxxx' // 長ったらしい値 a
$b = 'xxxxx..0..xxxxx' // 長ったらしい値 b
hash('md5', $a) === hash('md5', $b) // true, 偶然にも衝突が発生!
hash('md2', $a) === hash('md2', $b) // false, アルゴリズムが異なると衝突しない(可能性が高い)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.