MD5ハッシュを整数として表します
質問
ユーザーデータベーステーブルでは、ユーザーのメールアドレスのMD5ハッシュをIDとして使用します。
例: email(example@example.org)= id(d41d8cd98f00b204e9800998ecf8427e)
残念なことに、IDを整数値として表現する必要があります-IDが整数のみであるAPIを使用できるようにするために。
今、受信時に再度デコードを送信するために、idを整数にエンコードする方法を探しています。どうすればいいですか?
これまでの私のアイデア:
-
MD5ハッシュの
-
convert_uuencode()
およびconvert_uudecode()
- MD5ハッシュのすべての文字を
ord()
値で置き換えます
どのアプローチが優れていますか?これを行うより良い方法を知っていますか?
あなたが私を助けてくれることを願っています。よろしくお願いします!
解決
注意してください。 MD5を整数に変換するには、大きな(128ビット)整数をサポートする必要があります。使用しているAPIは、32ビット整数のみをサポートしている可能性があります-または、さらに悪いことに、浮動小数点の数値を処理している可能性があります。いずれにしても、IDは変更されます。この場合、2番目のIDを任意に割り当てるだけで、MD5を整数に変換しようとするよりもはるかに優れた方法で対処できます。
ただし、APIが問題なく任意の大きな整数を処理できることを確信している場合、MD5を16進数から整数に変換できます。ただし、PHPは32ビット整数または浮動小数点として表現しようとするため、おそらくこの組み込みをサポートしていません。おそらく PHP GMPライブラリを使用する必要があります。
他のヒント
別の方法で行うことには、他の人が述べた正当な理由があります。
しかし、あなたがしたいことがmd5ハッシュを stringに変換する場合 10進数の数字(これは、あなたが本当に意味するものだと思います md5はすでに文字列形式の整数であるため、「整数で表す」」、 そして、同じmd5文字列に変換して戻します:
function md5_hex_to_dec($hex_str)
{
$arr = str_split($hex_str, 4);
foreach ($arr as $grp) {
$dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
}
return implode('', $dec);
}
function md5_dec_to_hex($dec_str)
{
$arr = str_split($dec_str, 5);
foreach ($arr as $grp) {
$hex[] = str_pad(dechex($grp), 4, '0', STR_PAD_LEFT);
}
return implode('', $hex);
}
デモ:
$md5 = md5('example@example.com');
echo $md5 . '<br />'; // 23463b99b62a72f26ed677cc556c44e8
$dec = md5_hex_to_dec($md5);
echo $dec . '<br />'; // 0903015257466342942628374306682186817640
$hex = md5_dec_to_hex($dec);
echo $hex; // 23463b99b62a72f26ed677cc556c44e8
もちろん、先頭のゼロが失われないように文字列型としてのみ使用するようにしたり、文字列が正しい長さであることを確認するなど、いずれかの文字列を慎重に使用する必要があります。
32ビット圧縮の場合、MD5ハッシュの4つの16進ペア(8文字)を選択し、各ペアが1バイトを表し、それを intval()
。
未署名の32ビットIntの場合:
$inthash = intval(substr(md5($str), 0, 8), 16);
符号付き32ビットIntの正の値のみ:
$inthash = intval(substr(md5($str), 0, 8), 16) >> 1;
これは、ドキュメントに記載されているように、ほとんどの最新システムで64ビット(8バイトまたは16文字)までの値に対してのみ機能する可能性があります。
64ビットのIntに対応できるシステムでは、128ビットのMD5ハッシュ全体を2つのIntとして消費する分割戦略は次のようになります。
$hash = md5($str);
$inthash1 = intval(substr($hash, 0, 16), 16);
$inthash2 = intval(substr($hash, 16, 16), 16);
hexdec を使用して、16進文字列を解析して保存できます。データベース内の番号。
自動インクリメントのintフィールドである別のフィールドを追加しませんでしたか?
なぜord()ですか? md5は通常の16バイト値を生成し、読みやすくするために16進数で表示されます。そのため、16バイト値を損失なく4または8バイト整数に変換することはできません。これをidとして使用するには、アルゴリズムの一部を変更する必要があります。
概要:
$ float = hexdec(md5( 'string'));
または
$ int =(整数)(substr(hexdec(md5( 'string'))、0,9)* 100000000);
衝突の可能性は間違いなく大きくなりますが、DBでハッシュの代わりに使用しても十分ですか?
歓声、
/ Marcin
/var/myprocess/example@example.orgのような共有フォルダー内の空の一時ファイルのファイル名として電子メールアドレスを使用します
次に、ファイル名でftokを呼び出します。 ftokは一意の整数IDを返します。
ただし、一意であることは保証されませんが、おそらくAPIで十分です。