Как насчет этого: RhinoCommons, NHibernate и ASP.NET Часть 1 MVC - Установка
И также эта быстрая: Linq к Учебному руководству
NHibernate
Будьте осторожны. Для преобразования MD5 в целое число потребуется поддержка больших (128-битных) целых чисел. Скорее всего, API, который вы используете, будет поддерживать только 32-битные целые числа или, что еще хуже, может иметь дело с числами с плавающей запятой. В любом случае ваш идентификатор будет изменен. В этом случае простое назначение второго идентификатора произвольно - гораздо лучший способ справиться с проблемами, чем попытки преобразовать MD5 в целое число.
Однако, если вы уверены , что API может работать с произвольно большими целыми числами без проблем, вы можете просто преобразовать MD5 из шестнадцатеричного в целое число. PHP, скорее всего, не поддерживает эту встроенную функцию, поскольку он попытается представить ее как 32-битное целое число или как плавающую точку; вам, вероятно, потребуется использовать для этого библиотеку PHP GMP .
Есть веские причины, заявленные другими, для того, чтобы сделать это по-другому.
Но если вы хотите преобразовать хэш md5 в строку десятичных цифр (именно это, я думаю, вы действительно имеете в виду, "представлять целым числом", поскольку 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);
}
Demo:
$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
Конечно, вы должны быть осторожны, используя любую строку, например, убедитесь, что используете их только как строковый тип, чтобы избежать потери ведущих нулей, обеспечивая строки имеют правильную длину и т. д.
Почему ord ()? md5 производит обычное 16-байтовое значение, которое отображается в шестнадцатеричном формате для лучшей читаемости. Таким образом, вы не можете преобразовать 16-байтовое значение в 4- или 8-байтовое целое без потерь. Вы должны изменить некоторую часть ваших алгоритмов, чтобы использовать это как идентификатор.
You could use hexdec to parse the hexadecimal string and store the number in the database.
Не могли бы вы просто добавить еще одно поле, которое было бы полем с автоматическим приращением int?
как насчет:
$float = hexdec(md5('string'));
или
$int = (integer) (substr(hexdec(md5('string')),0,9)*100000000);
Определенно больше шансов на столкновение, но все же хорошо использовать вместо хэша в БД?
cheers,
/Marcin