【问题标题】:Can I store IP addresses as integers?我可以将 IP 地址存储为整数吗?
【发布时间】:2015-11-26 04:44:44
【问题描述】:

我记录了用户的IP地址。由于 IP 地址包含句点,因此我将它们存储为字符串。但我想通过尝试将它们保存为整数来节省服务器上的空间。

我考虑过这样做:

@user_ip = request.remote_ip.delete(".").to_i

例如,这会将“127.0.0.1”转换为127001

但我担心在这种方法下两个不同的 IP 地址可能会保存为同一个整数。

这可能吗?如果是这样,有没有更好的方法将 IP 地址保存为整数?

【问题讨论】:

  • ip4v 地址将适合无符号整数——每个八位字节为一个字节。你必须做一些转换。但这可能并不值得,它不是一种特别友好的查询格式(而且对于 ipv6 根本不起作用)。
  • 如果您的服务器有IP address type,可能值得使用。

标签: ruby-on-rails ruby integer ip


【解决方案1】:

进行这些转换的标准方法(在 C 语言中)称为 inet_aton(ascii 到数字)和 inet_ntoa(数字到 ascii)。 Ruby 等效方法包含在IPAddr

require 'ipaddr'

IPAddr.new("192.168.0.1").to_i
 => 3232235521 

IPAddr.new(3232235521, Socket::AF_INET).to_s
 => "192.168.0.1" 

但正如其他人在这里指出的那样,从数据库中查询数字表示并不总是可行的。但是,例如 MySQL 确实允许您在查询中直接使用 inet_ntoa/aton 函数:
http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html

如果您想开始过滤和查询带有网络掩码的 IP 地址,这很有用。有关如何设置它以及如何以这种方式运行查询的更多示例,请参见此处:
http://www.finnie.org/2007/12/05/mysql-and-cidr-selection/

【讨论】:

【解决方案2】:

按照您描述的方式,不可能“重新IP”它,因为您不知道将句点放在哪里。可以是 127.0.0.1 或 12.70.0.1 等。您可以为每个部分使用四个单独的列,如果您担心空间,整数大小只需为 9 或 8 无符号表示 0-255。

然后将它们放在一起ip_col_1+".".ip_col_2+"."+ip_col_3+"."+ip_col_4 以实际使用它。

正如 cmets 所提到的那样,除了使您的代码更复杂之外,我真的认为这不会有太大的不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2017-12-31
    • 2012-10-25
    相关资源
    最近更新 更多