Хэш -функция, преобразованная из JS в Python, висит на больших струнахPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Хэш -функция, преобразованная из JS в Python, висит на больших струнах

Сообщение Anonymous »

Я использовал эту функцию хэш cyrb53 в JS из этого ответа:
генерировать хэш из строки в javaScript < /p>
Идея состоит в том, чтобы создавать хеши из строк изображений, как это: < /p>
data:image/png;base64,iVBORI12FAZ6k2AAAAABJRU5ErkJggg=
< /code>
Я перемещаю свой проект на Python (мой первый проект Python) и уже имею тысячи хэшей, определяемых с использованием этого алгоритма, поэтому для согласованности мне нужно продолжать использовать ту же функцию в Python. Это будет работать с примером строки выше, но на полной строке данных изображения он висит трубку. В то время как JS принимает миллисекунды, Python находится в течение нескольких минут без завершения. < /P>
Вот функция JS: < /p>
const cyrb53 = (str, seed = 0) => {
let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
for(let i = 0, ch; i < str.length; i++) {
ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761);
h2 = Math.imul(h2 ^ ch, 1597334677);
}
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);

return 4294967296 * (2097151 & h2) + (h1 >>> 0);
};
< /code>
и вот мое преобразование Python: < /p>
def unsigned_right_shift(n, shift):
# Create a mask to simulate a 32-bit unsigned integer
mask = 0xFFFFFFFF
# Apply the mask to ensure the number is treated as unsigned
n &= mask
# Perform the right shift
result = n >> shift
return result

def cyrb53x(str, seed=0):
h1 = 0xdeadbeef ^ seed
h2 = 0x41c6ce57 ^ seed

for ch in str:
h1 = (h1 ^ ord(ch)) * 2654435761
h2 = (h2 ^ ord(ch)) * 1597334677

h1 = (h1 ^ unsigned_right_shift(h1 , 16)) * 2246822507
h1 ^= (h2 ^ unsigned_right_shift(h2 , 13)) * 3266489909
h2 = (h2 ^ unsigned_right_shift(h2 , 16)) * 2246822507
h2 ^= (h1 ^ unsigned_right_shift(h1 , 13)) * 3266489909

return 4294967296 * (2097151 & h2) + (h1 & 0xFFFFFFFF)
< /code>
Строки, передаваемые функции, очень велики, так как они являются кодированными изображениями Base64. Это просто ограничение производительности Python? При кратком входе выше, результат - 85900107939316 как для JS, так и для Python, поэтому функция выполняет техническую работу. Для одного из примеров моего реального мира, строка составляет более 1 млн.

Подробнее здесь: https://stackoverflow.com/questions/796 ... ge-strings
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»