Страница 1 из 3
Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 10:04
Гость
Так, чтобы получилось другое число, и из него можно было легко получить первоначальное. Легко - значит без долгих вычислений, но сам алгоритм не должен легко угадываться. Причем каждому числу от 0 до 100.000 должно соответствовать несколько чисел (чем больше, тем лучше). Чтобы результат криптования для одного и того же числа не слишком часто повторялся, в этом весь смысл.
Хинтергрунд: хочу спрятать Id, передаваемый в URL браузера. Чтобы не так легко было получить копию базы данных путем последовательного просмотра всех страниц и интерпретации ссылок, в которых этот Id присутствует.
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 10:11
Гость
/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
/// <param name="TextToHash">string der Gehasht werden soll.</param>
/// <returns>Hash als string.</returns>
public static string GetMD5Hash(string TextToHash)
{
//Prüfen ob Daten übergeben wurden.
if((TextToHash == null) || (TextToHash.Length == 0))
{
return string.Empty;
}
//MD5 Hash aus dem String berechnen. Dazu muss der string in ein Byte[]
//zerlegt werden. Danach muss das Resultat wieder zurück in ein string.
MD5 md5 = new MD5CryptoServiceProvider();
byte[] textToHash = Encoding.Default.GetBytes (TextToHash);
byte[] result = md5.ComputeHash(textToHash);
return System.BitConverter.ToString(result);
}
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 10:17
Гость
Гость писал(а):/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
/// <param name="TextToHash">string der Gehasht werden soll.</param>
/// <returns>Hash als string.</returns>
public static string GetMD5Hash(string TextToHash)
{
//Prüfen ob Daten übergeben wurden.
if((TextToHash == null) || (TextToHash.Length == 0))
{
return string.Empty;
}
//MD5 Hash aus dem String berechnen. Dazu muss der string in ein Byte[]
//zerlegt werden. Danach muss das Resultat wieder zurück in ein string.
MD5 md5 = new MD5CryptoServiceProvider();
byte[] textToHash = Encoding.Default.GetBytes (TextToHash);
byte[] result = md5.ComputeHash(textToHash);
return System.BitConverter.ToString(result);
}
спасибо. действительно, можно преобразовывать в строку, необязательно в другое число.
а хэш сложно считается?
может, есть что попроще. мне супернадежность не нужна, но нужна быстрота. ибо php не быстр, а ссылок на одной странице могут быть сотни, и каждую надо закриптовать. а вот раскриптовать - это менее критично, так как только один раз на страницу надо.
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 10:41
Гость
ну так попробуй, насколько быстро, в чём проблема -то? или сам функцию напиши, которая кодирует или декодирует
модераторы, перенесите топик из жизни, пехапэ "красивой жизнью" не назовёшь ))
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 15:13
minimax
Гость писал(а):/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
}
ничего не понимаю, хеширование MD5 например тут точно не пойдет так как хеширование всегда имеет коллизии (одинаковое значение хеша для разных ИД).
А ТС надо иметь однозначное восстановление из F(ID) само ID.
Я бы просто использовал битовую арифметику:
например умножал на 4 риверсировал биты и вставлял "K" (K= 0,1,2,3) нулей между изначальными битами а в конце записывал само "K"
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 17:09
minimax
Вован Водкин писал(а):minimax писал(а):Гость писал(а):/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
}
ничего не понимаю, хеширование MD5 например тут точно не пойдет так как хеширование всегда имеет коллизии (одинаковое значение хеша для разных ИД).
А ТС надо иметь однозначное восстановление из F(ID) само ID.
для чисел от 0 до 100000 точно подойдет
Код: Выделить всё
flux@xubuntu:~$ for i in {0..100000}; do echo "$i"|md5sum >>/tmp/md5.txt; [ "0" = $(( i%100 )) ] && echo "$i"; done
sort /tmp/md5.txt | uniq -d
хеш можно посчитать только один раз, но хранить в соседнем столбце и конвертировать в айди в подзапросе
ну может, я тоже об этом кстати подумал, но с другой стороны тогда нет множественности для F(ID) , правда ее конечно легко можно и добавить
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 17:15
Гость
minimax писал(а):Гость писал(а):/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
}
ничего не понимаю, хеширование MD5 например тут точно не пойдет так как хеширование всегда имеет коллизии (одинаковое значение хеша для разных ИД).
А ТС надо иметь однозначное восстановление из F(ID) само ID.
Я бы просто использовал битовую арифметику:
например умножал на 4 риверсировал биты и вставлял "K" (K= 0,1,2,3) нулей между изначальными битами а в конце записывал само "K"
во, правильное направление. коллизий точно не будет. вот только если множественность обеспечивать засчет K, то при K=10 числа слишком большие получатся. а было бы хорошо хотя бы 10 значений для каждого Id иметь.
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 17:25
Гость
Вован Водкин писал(а):
хеш можно посчитать только один раз, но хранить в соседнем столбце и конвертировать в айди в подзапросе
само значение Id - это не пароль, и тайной не является. нужна именно множественность, чтобы затруднить написание программы, которая бы парсила страницы и создавала копию моей базы, пользуясь Id в ссылках.
ну например, умножаем Id на 10 и прибавляем случайное число от 0 до 9. но это слишком примитивно.
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 17:29
Гость
Гость писал(а):
модераторы, перенесите топик из жизни, пехапэ "красивой жизнью" не назовёшь ))
а на чем сейчас сайты принято клепать?
Re: Простенько закриптовать число от 0 до 100.000
Добавлено: 27.05.2012 17:33
minimax
Гость писал(а):minimax писал(а):Гость писал(а):/// <summary>
/// Gibt einen MD5 Hash als String zurück
/// </summary>
}
ничего не понимаю, хеширование MD5 например тут точно не пойдет так как хеширование всегда имеет коллизии (одинаковое значение хеша для разных ИД).
А ТС надо иметь однозначное восстановление из F(ID) само ID.
Я бы просто использовал битовую арифметику:
например умножал на 4 риверсировал биты и вставлял "K" (K= 0,1,2,3) нулей между изначальными битами а в конце записывал само "K"
во, правильное направление. коллизий точно не будет. вот только если множественность обеспечивать засчет K, то при K=10 числа слишком большие получатся. а было бы хорошо хотя бы 10 значений для каждого Id иметь.
так оно и обеспечивается к - случайное из диапазона 0,1,2,3 больше нельзя так как умножение на 4 дает тебе только 2 бита = числа 0,1,2,3.
Как получить случайное знаешь?