引入大整数常量的最优雅/最具吸引力的方法是什么?

2024-06-28 15:03:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要引入大整数常量(Diffie-Hellman密钥交换的素数)

以符合PEP8的方式来做这件事,最适合的/最漂亮的方式是什么?最好不要反斜杠。你知道吗

我目前的做法是:

N = '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
       29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
       EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
       E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
       EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
       FFFFFFFF FFFFFFFF'''
PRIME = int('0x{0}'.format(N.replace('\n', '').replace(' ', '')), 16)

不是很漂亮,但比:

PRIME = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L

编辑:

更改为PRIME = int(re.sub('\s+', '', N), 16)


Tags: 方式密钥整数primereplace素数int常量
3条回答

如果你想要好看的东西,也许你可以把字符串转换成整数。虽然它可能不是最佳实践,因为我从来没有在实践中实际使用过它,但是我认为它比原来的方法更清楚一些,因为转换有限

number = (
    "179769313486231590770839156793787453197860296048756011"
    "706444423684197180216158519368947833795864925541502180"
    "565485980503646440548199239100050792877003355816639229"
    "553136239076508735759914822574862575007425302077447712"
    "589550957937778424442426617334727629299387668709205606"
    "050270810842907692932019128194467627007"
)
number = int(number)
179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L

坦白说,你所拥有的是相当不错的。唯一明显的变化是您的最终转换:您可以删除"0x{0}".format位,只传递替换的字符串,因为您给int基16。你知道吗

除此之外,您可以始终将其隐藏为函数:

def PrimeInt(string):
    return int(string.replace('\n','').replace(' ',''), 16)

PRIME = PrimeInt("""
        FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
        29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
        EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
        E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
        EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
        FFFFFFFF FFFFFFFF
        ''')

PEP 8 Style Guide

But most importantly: know when to be inconsistent sometimes the style guide just doesn't apply. When in doubt, use your best judgment. Look at other examples and decide what looks best. And don't hesitate to ask!

因此,保持常量不变,因为它比任何其他不明显的黑客更具可读性

最重要的是Readability counts.

没有什么能超越Python的核心原则

but there MUST be a more elegant way of doing PRIME = int('0x{0}'.format(N.replace('\n', '').replace(' ', '')), 16)...

如果你坚持

PRIME=long('17976931348623159077083915679378745319786029604875601'
          '17064444236841971802161585193689478337958649255415021805654859805'
          '03646440548199239100050792877003355816639229553136239076508735759'
          '91482257486257500742530207744771258955095793777842444242661733472'
          '7629299387668709205606050270810842907692932019128194467627007L')

相关问题 更多 >